2011-03-07 3 views
3

"괄호"구문을 사용하여 코드 블록을 하위 코드로 전달할 수 있습니까?Perl - 괄호 안의 매개 변수로 코드 블록

e.e. 내가 쓸 때

List::MoreUtils::any { defined ($_) } (undef, undef, 1); 

그것은 작동합니다. 그러나 괄호를 추가하려고 시도하면

List::MoreUtils::any ({ defined ($_) } , (undef, undef, 1)); 

이 표시되며 익명 해시로 해석되어 오류 메시지가 표시됩니다. 탈출하거나 eval을 사용하는 것도 도움이되지 않습니다. 호출이 인수를 다음 즉

if (first_index { defined (${$_})} $jms_positions > $jms_positionals_seen) 

일부 작업자가 원하지 않는 결과를 생성, 호출하기 전에 실행 될 수있다, 표현의 일부인 경우

모든 소란 뒤에 아이디어이다.

답변

15

을 익명 서브 루틴이 구문을 선언

sub { say "The sub with no name!" }; 

펄의 프로토 타입 시스템은 코드 블록은 첫 번째 매개 변수는 특별한 예외를 허용하는 경우를의 sub을 끝내고 Perl 내장 명령과 비슷한 블록을 그냥 지나칠 수 있습니다. 그러나 이것은 괄호없는 스타일로 호출 할 때만 작동합니다. 괄호를 사용하면 파서가 해시 - 참조를 전달하려고한다고 생각하게됩니다. 당신은 괄호를 사용하여 주장하는 경우

그래서 당신은

List::MoreUtils::any(sub { defined }, undef, undef, 1); 

을 말할 수있다.

+0

어떻게 든 작동합니다. 나는'sub '가 블럭 안의 return 문을 호출 원에게 아무것도 요구하지 않는다고 생각했다. 놀랍게도, 그렇지 않습니다! Perl의 구문은 실제로 내가 본 것 중 가장 이상한 구문입니다. –

+0

'sub {42}; 'returns 42. – Dallaylaen

+1

=> 괄호는 프로토 타입을 끄지 않습니다. 그것을 위해서'''sigil이 필요합니다. 이 경우 괄호는 perl의 파서를 혼동합니다. –

3

그냥 sub를 삽입 :

List::MoreUtils::any (sub { defined ($_) } , (undef, undef, 1)); 
5

아니요, 내장 만 가능합니다.

$ perl -ce'map({ "..." } @a)' 
-e syntax OK 

$ perl -ce'grep({ "..." } @a)' 
-e syntax OK 

$ perl -ce'sub f(&@); f { "..." } @a' 
-e syntax OK 

$ perl -ce'sub f(&@); f({ "..." } @a)' 
Array found where operator expected at -e line 1, near "} " 
     (Missing operator before ?) 
syntax error at -e line 1, near "} @a" 
-e had compilation errors. 

일반적으로 전체 통화에서 괄호를 추가하는 것이 좋습니다.

(any { defined } (undef, undef, 1))