我试图对函数的结果进行排序,就像在sort func();
中一样,因为没有返回任何内容而被烧毁。我猜Perl认为函数调用是一个排序例程,后面没有数据。
Perldoc说第二个参数可以是子程序名称或代码块。我将func()视为调用,而不是名称。我认为这根本不是DWIMMY。
为了进一步探讨这是如何运作的,我写了这个:
use strict;
use warnings;
sub func {
return qw/ c b a /;
}
my @a;
@a = sort func();
print "1. sort func(): @a\n";
@a = sort &func;
print "2. sort &func: @a\n";
@a = sort +func();
print "3. sort +func(): @a\n";
@a = sort (func());
print "4. sort (func()): @a\n";
@a = sort func;
print "5. sort func: @a\n";
输出,未生成警告:
1. sort func():
2. sort &func: a b c
3. sort +func(): a b c
4. sort (func()): a b c
5. sort func: func
1号是我的行为 - 没有输出。
我很惊讶2有效,而1没有。我认为它们是等价的。
我理解3和4,我用4来解决我的问题。
我真的很困惑5,尤其是在没有警告的情况下。
有人可以解释1和1之间的区别吗? 2,为什么5输出函数的名称?
答案 0 :(得分:13)
sort func()
解析为sort func ()
,即使用例程()
对空列表[func
]进行排序。
#5解析为sort ("func")
,对包含(bareword)字符串func
的列表进行排序。也许应该有关于此的警告,但事实并非如此。
Deparser输出:
$ perl -MO=Deparse -e '@a1 = sort func();' -e '@a2=sort &func;' \
-e '@a3=sort +func();' -e '@a4=sort (func());' -e '@a5=sort func;'
@a1 = (sort func ());
@a2 = sort(&func);
@a3 = sort(func());
@a4 = sort(func());
@a5 = sort('func');
-e syntax OK
答案 1 :(得分:11)
perldoc中有一节显示了如何对函数调用的返回进行排序:http://perldoc.perl.org/functions/sort.html
警告:排序函数返回的列表时需要语法上的注意。如果要对函数调用find_records(@key)返回的列表进行排序,可以使用:
@contact = sort { $a cmp $b } find_records @key;
@contact = sort +find_records(@key);
@contact = sort &find_records(@key);
@contact = sort(find_records(@key));
所以在你的情况下你可以这样做:
@a = sort( func() );