Perl:“参考转换是实验性的”

时间:2018-07-19 15:09:28

标签: perl

我正在尝试获取已排序的哈希键列表的第一个元素。

这可以按预期进行:

my $first = (sort keys %hash)[0];

这些不是

my $first = shift sort keys %hash;

my $first = shift (sort keys %hash); # just in case

它引发错误

  

参考转移是实验性的。
  不是阵列参考

这是怎么回事?

这是一个简单的操作,我无法弄清楚这个假定的引用在哪里。如果有引用,则第一种语法将不起作用。

我正在通过脚本顶部的use使用5.14版。

1 个答案:

答案 0 :(得分:5)

尽管这些术语通常可以互换使用,there is a distinction between a list and an array in Perlshift运算符需要一个数组,并且具有修改数组的副作用。 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引用,因此您会遇到错误。