2013-02-28 7 views
3

다음 파일을 컴파일되지 않습니다 :왜 펄 하위들 필요합니까 &

syntax error at foobar.pl line 5 near "return" 
    (Might be a runaway multi-line ;; string starting on line 3) 
foobar.pl had compilation errors. 

하지만 &s()으로 s()를 교체 할 경우 잘 작동합니다 : perl -c에서

sub s { 
    return 'foo'; 
} 
sub foo { 
    my $s = s(); 
    return $s if $s; 
    return 'baz?'; 
} 

오류입니다. 이유를 설명해 주시겠습니까?

+7

s /// 대체 연산자와 충돌합니다. –

+0

이 동의했습니다. sub를 a()로 이름을 바꾼다면 – nick

+0

@ PaulDixon이 맞을 것이기 때문에'm','y'와'q'는 아마도 subs의 나쁜 이름 일 것입니다. 실제로, 나는 m()이나 q()를 불평없이 컴파일 할 것이지만, 그것은 당신이 기대하는 것을하지 않을 것이다. – Axeman

답변

13

접두사 & 접두어는 동일한 이름의 내장이 아닌 "s"라는 고유 한 함수를 호출하려고합니다. 이 경우 대체 연산자 (예 : $stuff =~ s///;, 이는 s()()이라고 쓸 수 있음)와 혼동 스럽습니다.

여기에 a PerlMonks discussion about what the ampersand does입니다.

+1

당신 말이 맞아요.'sub s'와'$ s'가'sub t'와'$ t'로 바뀌었을 때 - 그런 실패는 없었습니다. – PSIAlt

+2

아마 이것은 단순한 테스트 케이스라는 것을 알았지 만, 이것은 좀 더 기술적 인 함수를 사용하는 예제 일 수 있습니다 이름도. 그들은 아마 다른 것으로 혼동 될 가능성이 적습니다. – Mike

3

이미 지적했듯이 s()s/// 대체 연산자로 해석됩니다. 앰퍼샌드로 함수 이름을 접두어로 붙이면 해결 방법이 될 수 있습니다. perldoc perlsub에서 다음은 호출 서브 루틴에 대해 말한다 :

NAME(LIST); # & is optional with parentheses. 
NAME LIST; # Parentheses optional if predeclared/imported. 
&NAME(LIST); # Circumvent prototypes. 
&NAME;  # Makes current @_ visible to called subroutine. 

앰퍼샌드 여기 않는 내장 된 기능과 자신을 구별하는 단지 무엇입니까.

이 문제를 해결하기위한 "적절한"방법은 서브 루틴의 이름을 바꾸는 것 말고는 무엇이 진행되고 있는지를 깨닫는 것입니다. 이상하게도에 strict와 - 당신이

s(); 

을 말할 때 무엇을 의미하는 것은

main::s(); 
+0

heh,'perl -e "CORE :: s/a/b /"'가 작동하지 않았다. 나는 놀라지 않았다; 그것은 나에게 결코 일어나지 않았다. – ikegami

+1

기분이 다소 이상하지 않습니까? :) – TLP

1
my $s = 's'->(); 

이 너무 작동하면 어떻게 당신이 정말로 말을하는 것은

CORE::s(); 

이다.

+0

+1 그 *는 이상합니다. – TLP

+0

@TLP, 상수 이름에 대해서만 작동합니다. 반면에,'my $ n = 's'; \ & $ n'은 엄격한 조건에서도 작동합니다. 별로 좋지 않아. – ikegami

+0

@ikegami 이상 하네. '& $ n'은 strict에 의해 잡히지 만, 코드 참조로 만들어 질 때는 그렇지 않습니다. 거의 버그처럼 들립니다. – TLP