2017-12-02 2 views
2

가정하자 내가 가진 내가스칼라 변수

use strict; 
my $sub_name = 'foo'; 

을 정의 foo (또는 ::foo, 또는 main::foo 당신이 선호하는 경우) 및 함수 간접적으로 "$sub_name에 저장된 이름의 함수"로 foo을 호출하고 싶습니다. 이 예제에서 호출은 인수로 1, 2, 3을 인수로 전달해야한다고 가정합니다.

main::의 심볼 테이블로 직접 작업하여이를 해시 대응 코드로 처리하면이 작업을 수행 할 수 있습니다. 같은 데이터 구조.

이 상징 표 주문은 내가 찾고있는 것입니다.

필자는 이전에 이런 종류의 일을 여러 번했지만 필자는 수년 동안 Perl을 프로그래밍하지 않았기 때문에 더 이상 주문을 기억하지 않습니다.

(내가 no strict에 의지하지 않고이 작업을 수행하는 것을 선호 싶지만, 더 비기이 가능하지 않는 경우.)

+0

가능한 속임수 : https://stackoverflow.com/q/1915616/5830574 – PerlDuck

+0

@PerlDuck : 나는 그 실을 보았지만 답은 보이지 않는다. 내 질문에. – kjo

답변

3

단순히 상징적 참조를 사용하십시오.

my $sub = \&$qualified_sub_name; # \&$symbol is except from strict 'refs'. 

$sub->() 

하지만 기호 참조를 사용하지 않기를 요청했습니다. 너무 복잡합니다. (그것은 콜론의 이상한하지만 합법적 인 오용을 처리하지 않을 수도 있습니다.)

my $pkg = \%::; 
my $sub_name = $qualified_sub_name; 
$pkg = $pkg->{$1} while $sub_name =~ s/^(.*?::)//sg; 
my $sub = $pkg->{$sub_name}; 
$sub = *{ $pkg->{$sub_name} }{CODE} 
    if ref(\$sub) eq 'GLOB'; # Skip if glob optimized away. 

$sub->() 
+1

당신의 대답이 내 기억을 엉망으로 만들었습니다. 내가 찾고 있던 것은''{* {$ {{foo '}} {CODE} (1,2,3)'라는 표현이었습니다. 감사! – kjo

+2

@ikegami 아니요, perl은 다른 슬롯 ('$ foo' 나'@ foo' 같은)이 없다면 간단한 하위'foo'의 경우를 최적화합니다. 그것은 부호 표를 기호 표에 직접 저장합니다. – melpomene

+1

다른 재미있는 경우는 상수입니다 :'perl -wE 'use constant foo => 42; $ :: {foo} ''-'SCALAR (0x3a9808)'라고 말하십시오. 혼란스럽지 않고 표준 펄 동작입니다. – melpomene

1

당신은 can을 사용할 수 있습니다 : 다른 언급했듯이

my $sub_name = 'foo'; 
my $coderef = main->can($sub_name); 
$coderef->(@args); 

,이 또한 수 "와 같은 방법을 반환 할 수 있음을 유의 "또는"isa ". $sub_nameSome::Module::subname이 포함되어 있으면이 또한 호출됩니다.

$sub_name에 무엇이 있는지 확실하지 않으면 다른 접근 방법을 원할 것입니다. $sub_name을 제어하고 예상 값만 포함 할 수있는 경우에만이 값을 사용하십시오. (나는 이것을 가정 했으므로이 대답을 썼다.)

+0

'$ sub_name '이 예일 경우 예기치 않은 결과가 반환 될 수 있습니다. ''isa ''. – melpomene

+0

OP는 서브 콜을 수행하는 방법을 물었고 메소드 호출이 아니 었습니다 (어쨌든 잘못 했었습니다 !!). 귀하의 접근 방식은 잘못된 하위가 호출 될 수 있습니다. – ikegami

+0

ikegami :'$ coderef ->()'는 하위 호출이며 메소드 호출이 아닙니다. – tinita