首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Perl Eval进行排序

使用Perl Eval进行排序
EN

Stack Overflow用户
提问于 2013-07-23 17:35:04
回答 2查看 245关注 0票数 0

我有一个类似下面的代码:

代码语言:javascript
运行
复制
sub mySub{
    my $sortMethod = shift;
    my @arr = @_;

    my @finalArr = eval "$sortMethod @arr";
    foreach( @finalArr ){
         ...do something....
    }
}

然后我想这样叫它:

代码语言:javascript
运行
复制
mySub( 'reverse', @someArr ); 

或者:

代码语言:javascript
运行
复制
mySub( 'sort', @someArr );

但是我得到了错误:

在“% 1 % 2”附近的(eval % 2)行%1处找到了需要运算符的位置(在%2之前缺少运算符?)在“%2% 3”附近的(eval % 2)行% 1处找到了需要运算符的位置(在%3之前缺少运算符?)

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

谁能告诉我我哪里做错了?

谢谢

EN

回答 2

Stack Overflow用户

发布于 2013-07-23 17:43:39

这个错误已经告诉你哪里出了问题

在“% 1 % 2”附近的(

% 2)行%1处找到了预期运算符的位置(在%2之前缺少运算符?)

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

在对数组进行插值时,元素由$"中包含的任何内容连接,默认情况下是空格。因此,您的eval字符串将变为

代码语言:javascript
运行
复制
sort 1 2 3 4

这当然不起作用。您需要将其设置为逗号分隔的字符串,您可以这样做:

代码语言:javascript
运行
复制
... "$sortmethod " . join(",", @arr);

您可能会对另一种方法感兴趣:

代码语言:javascript
运行
复制
my @reversed = foo(sub { reverse @_ }, @list);
my @sorted   = foo(sub { sort @_ }, @list);

sub foo {
    my $code = shift;
    $code->(@_);
}

另一种替代方法,允许您使用字符串查找排序方法:

代码语言:javascript
运行
复制
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 } @_; 
}
票数 3
EN

Stack Overflow用户

发布于 2013-07-23 18:27:53

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

我认为这应该行得通:

代码语言:javascript
运行
复制
my @finalArr;
my $res = eval "\@finalArr = $sortMethod \@arr";

这里的问题是,您正在使用@arr的实际价值加入$sortMethod。我想你会希望得到这样的结果:

代码语言:javascript
运行
复制
eval "sort @arr";

而不是:

代码语言:javascript
运行
复制
eval "sort 1,2,3";
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17806527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档