这个perl子函数如何返回任何东西?

时间:2018-03-07 15:05:41

标签: perl

我已经在各种脚本中使用了显示here的uniq几年的实现,我才意识到我不明白它是如何返回的一个数组。

该实施如下:

sub uniq {
    my %seen;
    grep !$seen{$_}++, @_;
}

my @array = qw(one two three two three);
my @filtered = uniq(@array);

有人可以解释这两行sub如何返回一个分配给@filtered的数组?即为什么我们不需要从grep线中获取一些结果并将其返回?

单独查看sub本身,我的假设是grep行是在通过引用@_传递的数组上运行的,并且调用行可能只是uniq(@array);,该呼叫后@array被修改。

这纯粹是出于我自己的理解,我对这个潜艇的功能毫无兴趣,我一直在使用它取得了巨大的成功。

2 个答案:

答案 0 :(得分:6)

  

为什么我们不需要从grep行获取一些结果并将其返回

你这样做,而且是。见perldoc perlsub

  

如果未找到“return”且最后一个语句是表达式,则返回其值。

答案 1 :(得分:2)

不清楚你不理解子程序的哪一部分。但在我们查看子程序之前,先简要说一下术语。

在Perl"列表"和"阵列"是两件不同的事情。子程序只返回一个列表,而不是一个数组。然后将返回的列表存储到数组@filtered中的事实没有区别 - 您最初从子例程返回的是列表。

考虑到这一点,让我们看看你的子程序。

传入数组@array。该数组的内容放入@_并传递给子例程。

然后在输入数组grep上使用@_grep充当列表过滤器 - 它将列表作为输入并返回(可能更短)列表作为输出。因此,您将获得一个值列表作为grep的输出。

由于您的子例程没有明确的return语句,因此它返回子例程中执行的最终语句的值。这是grep语句,因此子例程返回从grep返回的列表。

然后获取从子例程返回的列表并将其存储在@filtered中。

这有帮助吗?