使用Perl Eval排序

时间:2013-07-23 09:35:04

标签: perl eval

我有类似的代码:

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的数字(作为示例)

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

由于

2 个答案:

答案 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";