问题的简单模拟:
use strict; use warnings; sub uniq { my %seen; grep !$seen{$_}++, @_; } my @a = (1, 2, 3, 1, 2); print shift @{uniq(@a)};
使用“严格引用”时,不能将字符串(“3”)用作ARRAY引用
gg0vcinb1#
需要在函数调用上施加一个列表上下文,然后从列表中选取第一个元素。print或任何其他子例程调用已经提供了一个列表上下文。
print
print +( func(@ary) )[0];
这将忽略列表的其余部分。+是必需的(尝试不使用它),除非我们在print本身的所有参数周围都加上括号,即
+
print( (func(@ary))[0] );
nnsrf1az2#
一个选项可以是返回数组引用:
sub uniq { my %seen; [grep !$seen{$_}++, @_]; }
nxowjjhe3#
如果uniq返回了一个数组引用,那么@{uniq(...)}将是获取数组的正确习惯用法(这是shift的合适参数)。对于更一般的列表,可以将列表强制转换为数组引用,然后取消引用它。
uniq
@{uniq(...)}
shift
print shift @{ [ uniq(@a) ] };
3条答案
按热度按时间gg0vcinb1#
需要在函数调用上施加一个列表上下文,然后从列表中选取第一个元素。
print
或任何其他子例程调用已经提供了一个列表上下文。这将忽略列表的其余部分。
+
是必需的(尝试不使用它),除非我们在print本身的所有参数周围都加上括号,即nnsrf1az2#
一个选项可以是返回数组引用:
nxowjjhe3#
如果
uniq
返回了一个数组引用,那么@{uniq(...)}
将是获取数组的正确习惯用法(这是shift
的合适参数)。对于更一般的列表,可以将列表强制转换为数组引用,然后取消引用它。