2012-06-20 5 views
5


를 사용하여 참조하여 서브 루틴을 호출하는 문제는, 당신과 같이 참조 (또는 이름)으로 함수를 호출 할 수 있습니다 : 내가 뭘하려고 오전 사용펄 : 펄에서 해시 값

my $functionName = 'someFunction'; 
    &$functionName(); 

    #someFunction defined here: 
    sub someFunction { print "Hello World!"; } 

입니다 해시에서, 그래서 같은 값 : 내가 얻을

my %hash = (
     functionName => 'someFunction', 
    ); 

    &$hash{functionName}(); 

    #someFunction defined here: 
    sub someFunction { print "Hello World!"; } 

그리고 오류가 전역 기호 "$ 해시"명시 적으로 패키지 이름이 필요합니다.

내 질문은 : 중간 변수를 사용하지 않고이를 수행 할 올바른 방법이 있습니까?
이것에 대한 도움을 주시면 대단히 감사하겠습니다!

+3

'my % hash = (function => \ & someFunction)'도 할 수 있습니다.'stric이 필요 없습니다. t 'refs''. – TLP

+0

@TLP +1, 나는 * answer *하려고했습니다. '엄격한 사용; ** 많은 문제를 저장 ** ** – Dallaylaen

+0

나는 그것을 사용할 수 있지만 다소 (현재) 코드를 추가합니다 ... 나는 런타임에 functionName 값을 동적으로 설정하고 있습니다. 이름으로 함수를 호출합니다. Perl은 너무 재미 있습니다! – Thumper

답변

12

이는 단지 curlies를 생략하지 않아도 해결할 수있는 우선 순위 문제입니다.

인덱스 사이로서
$hash{functionName}->() 

->는 생략 할 수 있습니다 (하지만 난 여기가 생략하지 않음) : 당신은

&{ $hash{functionName} }() 

를 사용하거나 대체 구문을 사용할 수

$hash{functionName}() 

Ref : Deferencing Syntax

+0

와우, 내가 여기서 물어 본 첫 번째 질문이며, 오랜 기다림을 기다리고 있었다. 정말 고맙습니다! 내가 게시 한 첫 번째 솔루션을 사용하여 끝났습니다. 좋은 물건! 정말 고맙습니다. – Thumper

+0

또한 Perl에 상당히 익숙하다는 것을 언급 한 것을 잊어 버렸기 때문에 (아마도 1 개월의 경험이있을 것입니다.) 이것이 내 전문 개발에 도움이 될 것입니다. – Thumper

+1

대부분의 사람들이 화살표 표기법을 가장 잘 읽을 수 있기 때문에 약간 놀랍습니다. 그러나 둘 다 받아 들일 수 있습니다. – ikegami