为什么shift认为它在标量上下文中正在接收参数?

时间:2019-06-09 03:33:47

标签: perl perl5

我正在尝试确定列表中任何数字的最大位数。我发现我可以轻松地链接函数。因此,以下代码可以正常工作:

OnTouchesMoved

哪个会产生delta的预期结果。

但是,当我尝试与其余列表操作在同一行进行移位时:

use strict;
use diagnostics;

my @nums = qw/ 1 23 5432 45 /;
my @lengths = reverse sort map {1 + log($_)/log(10)} @nums;
my $max_length = shift @lengths;
printf "%d\n", $max_length;

我得到了错误

4

为什么shift认为它正在传递带有标量上下文的参数,却没有反向和排序?

谢谢

1 个答案:

答案 0 :(得分:4)

请注意shift的文档怎么说

  

转移阵列
  移

考虑到您不是给它一个数组(变量),而是一个表达式,它会立即将其关闭。

他们后来发表评论(我的重点)

  

从Perl 5.14开始,一项实验功能允许移位采用 scalar 表达式。该实验被认为不成功,从Perl 5.24开始被删除。

您显然正在运行5.24或更高版本。

要了解该错误消息,请参见文档以获取较早版本的文档,直到5.22.4为止,

  

转移阵列
  移位EXPR
  移

请注意,这里没有LIST。他们继续解释EXPR代表什么

  

从Perl 5.14开始,shift可以采用标量EXPR,该标量必须包含对无祝福数组的引用。该参数将自动取消引用。 shift的这一方面被认为是高度实验性的。

因此,看到一个表达式的旧版本将在标量上下文中对其进行计算,并将该标量传递给shift。 (然后,它会抱怨它不是数组引用。)仍然提到“标量上的 shift ”是为了提供信息,但在这一点上可能会造成混淆。

请注意,可以通过提取字符串的length来获得非负整数的长度

my @lengths = reverse sort map { length } @nums;

什么比对数有效得多。

此外,如果您真的只需要最长的一个

use List::Util qw(max);

my $max_length = max map { length } @nums;

在这种情况下可以更有效地完成

my $max_length = length max @nums;
相关问题