. 이렇게하면 심볼 테이블에 직접 액세스 할 수 있습니다. 엄격 모드에서도 작동한다는 것을 알 수 있습니다.
#! /usr/bin/env perl
use strict;
use warnings;
{
package Foo::Bar::Stix;
sub a{ print "sub a\n" }
sub b{ print "sub b\n" }
sub c{ print "sub c\n" }
}
my @funcs = qw' a b c ';
my %args;
for my $func (@funcs) {
$Foo::Bar::Stix::{$func}->(%args); # <====
}
또 다른 옵션은 :
my $symbol_table = $::{'Foo::'}{'Bar::'}{'Stix::'};
my %funcs = (
# we only want the CODE references
'a' => *{ $symbol_table->{'a'} }{'CODE'},
'b' => *{ $symbol_table->{'b'} }{'CODE'},
'c' => *{ $symbol_table->{'c'} }{'CODE'},
);
for my $func (@funcs) {
$funcs{$func}->(%args); # <====
}
당신이 서브 루틴의 많은 수의 그 일을 할려고하는 경우에,이 내가 %funcs
변수를로드 할 방법이다.
서브 루틴에 정규화 된 이름과 해시 변수를 통한 액세스가 필요한 경우가 아니면이 작업을 수행하지 않습니다.
해시 변수를 통해 서브 루틴에만 액세스해야하는 경우이를 설정하는 것이 좋습니다.
my %funcs = (
'a' => sub{ print "sub a\n" },
'b' => sub{ print "sub b\n" },
'c' => sub{ print "sub c\n" },
);
참고 : 당신이 "my %funcs
"를 대체 할 수있는 "our %funcs
"
대문자 질문에 연결하는 경우 +1. 운명이 너무 나빠서 PERL로 Perl을 생각하면 아무 것도 작동하지 않습니다. – innaM
'$ Foo :: Bar :: Stix :: {$ func} -> (% args);'도 작동 할 것이므로 엄격한 설정을 해제 할 필요가 없습니다. –