我正在尝试确定列表中任何数字的最大位数。我发现我可以轻松地链接函数。因此,以下代码可以正常工作:
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认为它正在传递带有标量上下文的参数,却没有反向和排序?
谢谢
答案 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;