我正在尝试获取已排序的哈希键列表的第一个元素。
这可以按预期进行:
my $first = (sort keys %hash)[0];
这些不是
my $first = shift sort keys %hash;
my $first = shift (sort keys %hash); # just in case
它引发错误
参考转移是实验性的。
不是阵列参考
这是怎么回事?
这是一个简单的操作,我无法弄清楚这个假定的引用在哪里。如果有引用,则第一种语法将不起作用。
我正在通过脚本顶部的use
使用5.14版。
答案 0 :(得分:5)
尽管这些术语通常可以互换使用,there is a distinction between a list and an array in Perl。
shift
运算符需要一个数组,并且具有修改数组的副作用。 sort keys %hash
的结果是一个列表,但不是数组,并且不是shift
的有效参数。有一些技巧可以使shift
与任意列表一起使用
$x = shift @{[sort keys %hash]} # for example
但是如果您只是因为想要列表的第一个元素而调用shift
,则有更简洁的方法来实现。
my $first = (sort keys %hash)[0];
my ($first) = sort keys %hash; # list context assignment
my $first = [sort keys %hash]->[0];
(我喜欢最后一种构造,但是我不判断它是否以错误的方式摩擦了你
“实验性”问题是,最新版本的Perl允许您在数组 reference
上调用shift
@a = (1,2,3); print shift @a; # 1
$a = [4,5,6]; print shift $a; # 4
在非命名数组上调用shift
时,perl假定您正在使用shift EXPR
形式的命令,对数组引用进行操作。由于这是“实验性的”,因此您会得到警告。然后,perl发现shift
之后的内容实际上不是ARRAY引用,因此您会遇到错误。