我有一个类似下面的代码:
sub mySub{
my $sortMethod = shift;
my @arr = @_;
my @finalArr = eval "$sortMethod @arr";
foreach( @finalArr ){
...do something....
}
}
然后我想这样叫它:
mySub( 'reverse', @someArr );
或者:
mySub( 'sort', @someArr );
但是我得到了错误:
在“% 1 % 2”附近的(eval % 2)行%1处找到了需要运算符的位置(在%2之前缺少运算符?)在“%2% 3”附近的(eval % 2)行% 1处找到了需要运算符的位置(在%3之前缺少运算符?)
我发送的数组包含从1到5的数字(作为示例)
谁能告诉我我哪里做错了?
谢谢
发布于 2013-07-23 17:43:39
这个错误已经告诉你哪里出了问题
在“% 1 % 2”附近的(
% 2)行%1处找到了预期运算符的位置(在%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 } @_;
}
发布于 2013-07-23 18:27:53
您是否尝试在eval字符串中对Array进行转义?
我认为这应该行得通:
my @finalArr;
my $res = eval "\@finalArr = $sortMethod \@arr";
这里的问题是,您正在使用@arr的实际价值加入$sortMethod。我想你会希望得到这样的结果:
eval "sort @arr";
而不是:
eval "sort 1,2,3";
https://stackoverflow.com/questions/17806527
复制相似问题