gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:42:38 30 4
gpt4 key购买 nike

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

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 的预期结果。

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

use strict;
use diagnostics;

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

我得到了错误

Experimental shift on scalar is now forbidden at - line 5, near "@nums;"

为什么 shift 认为它传递的是一个带有标量上下文的参数,而 reverse 和 sort 却不这样认为?

谢谢

最佳答案

请注意 shift 的文档说

shift ARRAY
shift

鉴于您没有给它一个数组(一个变量),而是一个表达式,它会立即将其忽略。

他们稍后有评论(我强调)

Starting with Perl 5.14, an experimental feature allowed shift to take a scalar expression. This experiment has been deemed unsuccessful, and was removed as of Perl 5.24.

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

要了解错误消息,请参阅旧版本的文档,直到 5.22.4 , 与

shift ARRAY
shift EXPR
shift

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

Starting with Perl 5.14, shift can take a scalar EXPR, which must hold a reference to an unblessed array. The argument will be dereferenced automatically. This aspect of shift is considered highly experimental.

所以旧版本看到一个表达式,会在标量上下文中计算它并将该标量传递给 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;

关于perl - 为什么 shift 认为它在标量上下文中接收参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56511778/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com