mhd*_*mhd 0 perl dispatch-table
这是我目前的想法,但我不知道如何派遣/执行它
my $key;
my @arraydata;
my %commandfunc{
"ab 1", \&func1(\@arraydata),
"ab 2", \&func2(\@arraydata,
"ab 3", \&func3(\@arraydata)
};
foreach $k (keys %commandfunc){
if($something =~ /$k/){ #if $something match with a key string
$key= $k;
#some processing arraydata here;
}
}
#dispatching??
my $command = $commandfunc{$key}->(\@arraydata);
请更正我的代码..非常感谢
散列用常规的parens(( ))初始化,而不是大括号(用于散列引用.)并使用列表赋值初始化散列.所以第一部分应该是:
my %commandfunc = (
"ab 1" => \&func1,
"ab 2" => \&func2,
"ab 3" => \&func3
);
Run Code Online (Sandbox Code Playgroud)
该=>运营商比使用逗号更漂亮一点,对左侧,引用裸字,如果有必要的额外的好处.
我不确定你在循环中想要匹配什么($_来自哪里?)但是你可以这样做:
foreach my $k (keys %commandfunc) {
if( $something =~ /$k/) {
my $result = $commandfunc{$k}->( \@arraydata );
}
}
Run Code Online (Sandbox Code Playgroud)
\&func1是一个子例程引用,但是\&func1(\@arraydata)对对&func1的调用返回的值的引用.试着改为:"ab 1" => \&func1, ....@arraydata的传递在您的调度代码中是正确的.
请注意,/$k/将使元字符像.或*在正则表达式中有特殊效果; 如果你不想那样做,那就做吧/\Q$k/.或者你可能只想要eq $k?