我已经在各种脚本中使用了显示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
被修改。
这纯粹是出于我自己的理解,我对这个潜艇的功能毫无兴趣,我一直在使用它取得了巨大的成功。
答案 0 :(得分:6)
为什么我们不需要从grep行获取一些结果并将其返回
你这样做,而且是。见perldoc perlsub
:
如果未找到“return”且最后一个语句是表达式,则返回其值。
答案 1 :(得分:2)
不清楚你不理解子程序的哪一部分。但在我们查看子程序之前,先简要说一下术语。
在Perl"列表"和"阵列"是两件不同的事情。子程序只返回一个列表,而不是一个数组。然后将返回的列表存储到数组@filtered
中的事实没有区别 - 您最初从子例程返回的是列表。
考虑到这一点,让我们看看你的子程序。
传入数组@array
。该数组的内容放入@_
并传递给子例程。
然后在输入数组grep
上使用@_
。 grep
充当列表过滤器 - 它将列表作为输入并返回(可能更短)列表作为输出。因此,您将获得一个值列表作为grep
的输出。
由于您的子例程没有明确的return
语句,因此它返回子例程中执行的最终语句的值。这是grep
语句,因此子例程返回从grep
返回的列表。
然后获取从子例程返回的列表并将其存储在@filtered
中。
这有帮助吗?