使用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的错误