这是我的测试代码:
#!/bin/perl
use strict;
use Array::Utils qw[array_minus];
sub sub1 {
my @array1 = qw(1 2 3);
my @array2 = qw(1 3 5);
my @arrayMinus = array_minus(@array1, @array2);
my @sortedArrayMinus = sort @arrayMinus;
print "Result from array_minus + sort : " . join(",", @sortedArrayMinus) . "\n";
my @sortedArrayMinus2 = sort array_minus(@array1, @array2);
print "Result from sort array_minus : " . join(",", @sortedArrayMinus2) . "\n";
}
sub1("a","b");
当我运行它时,它会得到以下结果:
Result from array_minus + sort : 2
Can't use string ("b") as an ARRAY ref while "strict refs" in use at Array/Utils.pm line 123.
因此,对array_minus的第二次调用因参数错误而失败。
我正在使用Array :: Utils库的0.5版(我已经从http://cpansearch.perl.org/src/ZMIJ/Array-Utils-0.5/Utils.pm手动复制了它) 该文件的相关行是:
sub array_minus(\@\@) {
my %e = map{ $_ => undef } @{$_[1]};
return grep( ! exists( $e{$_} ), @{$_[0]} );
}
如果我在array_minus中调试@_的值,则第一次调用的值为OK,但第二次调用的值为['a','b']。
所以它的行为就好像array_minus sub接收sub1的参数,而不是我传递的参数,但只有当我还要求在同一行上对结果进行排序时。我的代码有什么问题? 我正在使用Perl 5.22.1。
答案 0 :(得分:9)
这个表达式:
sort array_minus(@array1, @array2)
实际上意味着“使用@array1
作为比较函数来对通过连接@array2
和array_minus
产生的列表进行排序”。
如perldoc -f sort
中所述:
警告:排序函数返回的列表时需要语法上的注意。如果要对函数调用
find_records(@key)
返回的列表进行排序,可以使用:my @contact = sort { $a cmp $b } find_records @key; my @contact = sort +find_records(@key); my @contact = sort &find_records(@key); my @contact = sort(find_records(@key));
...因为否则你会遇到sort SUBNAME LIST
语法(由于历史原因而存在:perl在支持子例程引用之前很久就有sort
。)
答案 1 :(得分:7)
阅读sort中的警告并修复语法:
my @sortedArrayMinus2 = sort(array_minus(@array1, @array2));
原始语法告诉sort
使用array_minus
作为比较函数。