gpt4 book ai didi

arrays - 为什么我的 Perl 子程序接收其父程序的参数?

转载 作者:行者123 更新时间:2023-12-02 05:29:51 25 4
gpt4 key购买 nike

这是我的测试代码:

#!/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 中 @_ 的值,它的值对于第一次调用是正确的,但对于第二次调用它是 [ 'a', 'b' ]。

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

最佳答案

这个表达式:

sort array_minus(@array1, @array2)

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

perldoc -f sort 中所述:

Warning: syntactical care is required when sorting the list returned from a function. If you want to sort the list returned by the function call find_records(@key), you can use:

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

关于arrays - 为什么我的 Perl 子程序接收其父程序的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38140665/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com