为什么我的Perl子接收其父级的参数?

Mos*_*roy 2 arrays sorting parameters perl

这是我的测试代码:

#!/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");
Run Code Online (Sandbox Code Playgroud)

当我运行它时,它给出以下结果:

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.
Run Code Online (Sandbox Code Playgroud)

因此,对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]} ); 
}
Run Code Online (Sandbox Code Playgroud)

如果我在array_minus中调试@_的值,则第一次调用的值为OK,但第二次调用的值为['a','b'].

所以它的行为就像array_minus sub接收sub1的参数,而不是我传递的参数,但只有当我还要求在同一行上对结果进行排序时.我的代码有什么问题?我正在使用Perl 5.22.1.

mel*_*ene 9

这个表达式:

sort array_minus(@array1, @array2)
Run Code Online (Sandbox Code Playgroud)

真正的意思是"排序从串联产生的列表@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));
Run Code Online (Sandbox Code Playgroud)

...因为否则你会遇到sort SUBNAME LIST语法(由于历史原因而存在:perl早sort在它支持子例程引用之前就已存在).


cho*_*oba 7

阅读sort中的警告并修复语法:

my @sortedArrayMinus2 = sort(array_minus(@array1, @array2));
Run Code Online (Sandbox Code Playgroud)

原始语法告诉sort我们使用它array_minus作为比较函数.