我有类似的代码:
sub mySub{
my $sortMethod = shift;
my @arr = @_;
my @finalArr = eval "$sortMethod @arr";
foreach( @finalArr ){
...do something....
}
}
然后我想这样称呼它:
mySub( 'reverse', @someArr );
或:
mySub( 'sort', @someArr );
但我收到错误:
运算符预期在(eval 2)第1行,“1 2”附近的数字 (2之前缺少操作员?) 操作员预期在(eval 2)第1行,“2 3”附近的编号 (3之前缺少操作员?)
我发送的数组包含1到5的数字(作为示例)
有人可以告诉我我做错了吗?
由于
答案 0 :(得分:3)
错误已经告诉你出了什么问题
运算符预期在(eval 2)第1行,“1 2”附近的数字(2之前缺少运算符?)
它找到了一个预期运营商的数字。运算符将是逗号运算符。它告诉你它在哪里找到它,在2号之前。
插入数组时,元素由$"
中包含的任何内容连接,默认为空格。所以你的eval字符串变为
sort 1 2 3 4
这当然不起作用。你需要使它成为逗号分隔的字符串,你可以这样做:
... "$sortmethod " . join(",", @arr);
您可能对另一种方法感兴趣:
my @reversed = foo(sub { reverse @_ }, @list);
my @sorted = foo(sub { sort @_ }, @list);
sub foo {
my $code = shift;
$code->(@_);
}
另一种替代方法,它允许您使用字符串查找排序方法:
my %sort = (
'numasc' => \&sort_num_asc,
'asc' => \&sort_asc,
'desc' => \&sort_desc,
);
my @list = $sort{$method}->(@arr):
sub sort_num_asc {
sort { $a <=> $b } @_;
}
sub sort_asc {
sort @_;
}
sub sort_desc {
sort { $b cmp $a } @_;
}
答案 1 :(得分:1)
您是否尝试在您的eval字符串中转义数组?
我认为这应该有效:
my @finalArr;
my $res = eval "\@finalArr = $sortMethod \@arr";
这里的问题是你加入$ sortMethod和@arr的实际值。我想你想得到这样的结果:
eval "sort @arr";
而不是:
eval "sort 1,2,3";