2014-12-26 1 views
3

(최근 필자는 O'Reilly Perl 학습 Perl 6 판)을 사용하여 Perl을 배우기로 결정했습니다.소스 코드에 표시가없는 반환 된 변수

목표 : 소스 배열의 평균보다 큰 숫자 만 포함하는 다른 목록의 숫자 목록을 만듭니다. 그러나

이 내용은이 책에 의해 제공되었습니다.

my @fred = above_average(1..10); 
print "\@fred is @fred\n"; 
print "(Should be 6 7 8 9 10)\n"; 

my @barney = above_average(100, 1..10); 
print "\@barney is @barney\n"; 
print "(Should be just 100)\n"; 

이것은 나의 답변입니다.

sub total { 
    #computes total of array 
} 
sub average { 
    #computers average from 
    #array and length of said array 
} 

sub above_average { 
    $average = average(@_); 
    my @ab_avr; 
    foreach $num (@_) { 
     if ($num > $average) { 
      push @ab_avr, $num; 
     } 
    } 
    @ab_avr; 
} 

첫 번째 샘플이 작동하는 것 같군,하지만 두 번째 샘플은 정확 (100), 출력 만 100 전혀 반환되는 이유를 이해하지 않습니다. above_average()에 전달 된 배열은 추가 매개 변수 100과 함께 1에서 10까지의 숫자였습니다. 기본 변수 $ _가 사용되지 않았 으면 100이 표시되는 이유는 무엇입니까?

감사합니다.

+2

몇 가지 스타일 노트는 미래의 독자를 위해 반환되는 내용을 명시하기 위해 항상'return'을 사용합니다. Perl이 아직 암시 적 리턴을 가르치지 않기를 바랍니다. 그리고 (거의하지 않는) 글로벌 변수를 필요로하지 않는 한'my $ '를 포함하여 모든 변수를 선언하여 블록 범위로 제한합니다. Learning Perl은 이것을 시행 할 [strict] (http://perldoc.perl.org/strict.html)에 대해 가르쳐야합니다. – Schwern

+0

'(1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 100)/11 = 14.0909' –

+0

@Schwern 아, 스타일 팁 주셔서 감사합니다. 나는 읽을 때 '사용'을 놓쳐 버렸음에 틀림 없다. – user2442110

답변

2

Lists and arrays are subtly different. 배열을 서브 루틴에 전달할 수 없습니다. 모든 서브 루틴은리스트와 리턴리스트를 취합니다; 전달 된 전체 목록은 배열 @_ 인 것처럼 서브 루틴에서 사용할 수 있습니다. 이 경우

, 당신은 100, 1..10를 전달하는, 그래서 @_ 사실 100, 1, 2, 3, ..., 10

이 실제로 코드에서 문제가되지 않습니다 포함되어 있지만합니다 가능하다면 항상 어휘를 사용하려고 노력해야한다. my $average =, foreach my $num 및 엄격한 경고를 사용하십시오.

+3

어레이와리스트의 차이점은 경험 많은 펄 프로그래머조차도 명확하지 않습니다. 아마도 당신은 그 설명이나 설명에 대한 설명을 해줄 수 있습니까? – Schwern

관련 문제