使用Perl Eval进行排序

使用Perl Eval进行排序,perl,eval,Perl,Eval,我有一个类似的代码: sub mySub{ my $sortMethod = shift; my @arr = @_; my @finalArr = eval "$sortMethod @arr"; foreach( @finalArr ){ ...do something.... } } 然后我想这样称呼它: mySub( 'reverse', @someArr ); eval "sort @arr"; 或: 但我有错误: 在

我有一个类似的代码:

sub mySub{
    my $sortMethod = shift;
    my @arr = @_;

    my @finalArr = eval "$sortMethod @arr";
    foreach( @finalArr ){
         ...do something....
    }
}
然后我想这样称呼它:

mySub( 'reverse', @someArr ); 
eval "sort @arr";
或:

但我有错误:

在(评估2)第1行“1 2”附近的操作员预期位置找到的编号 (2号之前缺少操作员?) 在(评估2)第1行“2 3”附近操作员期望的位置找到的编号 (3号之前缺少操作员?)

我发送的数组包含从1到5的数字(例如)

有人能告诉我我做错了什么吗


谢谢

错误已经告诉您出了什么问题

在(评估2)第1行“12”附近的操作员预期位置找到的编号(2之前缺少操作员?)

它找到了一个需要操作员的号码。运算符将是逗号运算符。它告诉你它在哪里找到的,在2号之前

插入数组时,元素由
$“
中包含的任何元素连接,默认情况下为空格

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 } @_; 
}
my%排序=(
'numasc'=>\&sort\u num\u asc,
“asc”=>\&sort\u asc,
'desc'=>\&sort\u desc,
);
my@list=$sort{$method}->(@arr):
子分类数量asc{
排序{$a$b}@;
}
子分类{
分类,;
}
子分类描述{
排序{$b cmp$a}@;
}

错误已经告诉您出了什么问题

在(评估2)第1行“12”附近的操作员预期位置找到的编号(2之前缺少操作员?)

它在需要运算符的地方找到了一个数字。该运算符将是逗号运算符。它在数字2之前告诉您它在哪里找到它

插入数组时,元素由
$“
中包含的任何元素连接,默认情况下为空格。所以你的求值字符串变为

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 } @_; 
}
my%排序=(
'numasc'=>\&sort\u num\u asc,
“asc”=>\&sort\u asc,
'desc'=>\&sort\u desc,
);
my@list=$sort{$method}->(@arr):
子分类数量asc{
排序{$a$b}@;
}
子分类{
分类,;
}
子分类描述{
排序{$b cmp$a}@;
}

您是否尝试在求值字符串中转义数组

我认为这应该奏效:

my @finalArr;
my $res = eval "\@finalArr = $sortMethod \@arr";
这里的问题是,您将$sortMethod与@arr的实际价值结合起来。我认为您希望得到这样的结果:

mySub( 'reverse', @someArr ); 
eval "sort @arr";
而不是:

eval "sort 1,2,3";

您是否尝试在求值字符串中转义数组

我认为这应该奏效:

my @finalArr;
my $res = eval "\@finalArr = $sortMethod \@arr";
这里的问题是,您将$sortMethod与@arr的实际价值结合起来。我认为您希望得到这样的结果:

mySub( 'reverse', @someArr ); 
eval "sort @arr";
而不是:

eval "sort 1,2,3";


为什么要在那里使用eval?因为我想根据任何人希望排序的内容对数组进行排序,一个特定的情况可能是“sort mySpecificSort()”,然后我打印该数组,我想使其动态,而不是非常具体,让调用该方法的人指定他自己的排序方法为什么在那里使用eval?因为我想根据任何人希望排序的内容对该数组进行排序,一个特定的情况可能是“sort mySpecificSort()”,然后我打印该数组,我想使其动态,而不是非常具体,只要让调用该方法的人指定自己的排序方法,即使我指定和数组为@arr=(3,1,2,5,4)不起作用,我也会以另一种方式思考,+1用于解决
eval
问题,以及我更喜欢的另一种方法。@Birei这是传递代码块的经典方式。这很好,除了额外的打字,但在某种程度上我喜欢。我怀疑可以将其简化为原型的适当的
排序
/
映射
样式,但我从不喜欢使用这些样式。@Andreidonca不是一个很好的描述事物的方式。@Andreidonca我的意思是:它应该对我有用,对你也有用,所以除非你告诉我出了什么问题,我帮不了你。即使我指定和数组为@arr=(3,1,2,5,4)不起作用,我也在以另一种方式思考,+1用于解决
eval
问题,以及我更喜欢的另一种方法。@Birei这是传递代码块的经典方式。这很好,除了额外的打字,但在某种程度上我喜欢。我怀疑可以将其简化为原型的适当的
排序
/
映射
样式,但我从不喜欢使用这些样式。@Andreidonca不是一个很好的描述事物的方式。@Andreidonca我的意思是:它应该对我有用,对你也有用,所以除非你告诉我出了什么问题,我帮不了你。非常感谢,就是这样:)事实上,它确实修改了@arr的原始值。在我的例子中,@arr来自一个xml文件,我使用CGI以html打印它,这是apache
试图修改只读值时出现的错误…
尝试使用以下行:my@finalArr;我的$res=eval“\@finalArr=$sortMethod@arr”;$res将保留您评估的结果状态。如果我这样做,我将返回到我开始的位置,在(评估1)行1的“3 1”附近找到相同的错误
编号,该错误来自测试脚本,在实际情况下,apache挂起:|@Andreidanca出现这些问题的原因是
eval
解决方案是一个非常糟糕和脆弱的解决方案。如果您想让它工作起来更简单,请使用我建议的替代解决方案。非常感谢,就是这样:)事实上,它确实修改了@arr的原始值。在我的例子中,@arr来自一个xml文件,我使用CGI以html打印它,这是来自apach的错误