【问题标题】:Why does my Perl sub receive the parameters of its parent?为什么我的 Perl 子程序会收到其父程序的参数?
【发布时间】:2016-11-03 14:03:19
【问题描述】:

这是我的测试代码:

#!/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。

【问题讨论】:

  • 您正在使用字符串初始化似乎只包含数字的数组。 本身不一定是错的,但很奇怪。此外,普通排序将使用字符串比较而不是数字,因此 @x = (11, 1, 7) 将排序为 1, 11, 7 -- 这可能不是您想要的。

标签: arrays perl sorting parameters


【解决方案1】:

这个表达式:

sort array_minus(@array1, @array2)

真正的意思是“使用array_minus作为比较函数,对连接@array1@array2产生的列表进行排序”。

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)。

【讨论】:

    【解决方案2】:

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

    my @sortedArrayMinus2 = sort(array_minus(@array1, @array2));
    

    原始语法告诉sort 使用array_minus 作为比较函数。

    【讨论】:

    • 没有说明的是 sort 本身将使用字符串比较,即使数组似乎包含由于某种原因被初始化为字符串的数字。
    猜你喜欢
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-18
    • 1970-01-01
    相关资源
    最近更新 更多