2014-04-30 2 views
1

주어진 접두사로 시작하는 많은 함수가 있습니다. 이러한 함수의 배열을 만든 다음 하나씩 실행하고 싶습니다.Perl에서 함수 참조 배열 생성

고려 :

use v5.12; 

my @names = qw(a b); 
my @ss = map { "s".$_ } @names; 

sub sa { 
    say "a"; 
} 

sub sb { 
    say "b"; 
} 

여기서 함수 프리픽스 s이다. for 루프를 사용하여 이러한 함수를 하나씩 호출하는 방법은 무엇입니까? ( map 명령 안에 \&을 삽입하려고 시도했지만 작동하지 않습니다.)

모든 기능이 동일한 인수를 사용한다는 것을 알아 두십시오. 이것이 내가 할 수있는 유용한 것이라고 생각합니다.

답변

4

한 가지 가능한 방법 :

use 5.012; 

my @names = qw(a b); 
my @ss = map { \&{"s$_"} } @names; 

sub sa { 
    say "a"; 
} 

sub sb { 
    say "b"; 
} 

&$_() for @ss; 

Demo. 즉, 함수에 대한 참조가 저장됩니다. 엄격한 모드에서 실패 @ss에 서브 루틴 이름을 저장하고 (& sygil에) 사람들을 호출합니다 :

서브 루틴 심판으로 문자열 ("SA")를 사용할 수 없습니다 동안 "엄격한 심판"

그리고, 아마도 나를 그냥,하지만 난 오히려 해시에서이 함수를 정의하는 것 :

my %hof = (
    a => sub { say 'a'; }, 
    b => sub { say 'b'; }, 
    c => sub { say 'c: ' . $_[0]; }, 
); 

$hof{$_}('something') for sort keys %hof; 

출력

a 
b 
c: something 
2
use strict; 
use warnings; 
use v5.12; 

use Data::Dumper; 

my @names = qw(a b); 
my @ss = map { $main::{"s$_"} } @names; 

$_->() for @ss; 


sub sa { 
    say "a"; 
} 

sub sb { 
    say "b"; 
}