0

我有一个类似的代码:

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 的数字(例如)

有人可以告诉我我做错了什么吗?

谢谢

4

2 回答 2

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 } @_; 
}
于 2013-07-23T09:43:39.283 回答
1

您是否尝试在 eval 字符串中转义 Array ?

我认为这应该有效:

my @finalArr;
my $res = eval "\@finalArr = $sortMethod \@arr";

这里的问题是您加入 $sortMethod 并具有您的@arr 的实际价值。我想你想得到这样的结果:

eval "sort @arr";

代替:

eval "sort 1,2,3";
于 2013-07-23T10:27:53.423 回答