如何在Perl中创建一个调度表,其中键包含空格,子例程接受数组参数?

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);

请更正我的代码..非常感谢

fri*_*edo 6

散列用常规的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)


yst*_*sth 5

\&func1是一个子例程引用,但是\&func1(\@arraydata)对对&func1的调用返回的值的引用.试着改为:"ab 1" => \&func1, ....@arraydata的传递在您的调度代码中是正确的.

请注意,/$k/将使元字符像.或*在正则表达式中有特殊效果; 如果你不想那样做,那就做吧/\Q$k/.或者你可能只想要eq $k