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

Perl 为什么shift认为它在标量上下文中接收参数?,perl,Perl,我试图确定列表中任何数字的最大位数。我发现我可以很容易地链接函数。因此,以下代码按预期工作: 严格使用; 使用诊断; my@nums=qw/123543245/; my@length=reverse sort map{1+log$\/log10}@nums; 我的$max_长度=移位@长度; printf%d\n,$max\u长度; 这将产生4的预期结果 但是,当我尝试在与列表其余操作相同的行上执行shift时: 严格使用; 使用诊断; my@nums=qw/123543245/; my$max

我试图确定列表中任何数字的最大位数。我发现我可以很容易地链接函数。因此,以下代码按预期工作:

严格使用; 使用诊断; my@nums=qw/123543245/; my@length=reverse sort map{1+log$\/log10}@nums; 我的$max_长度=移位@长度; printf%d\n,$max\u长度; 这将产生4的预期结果

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

严格使用; 使用诊断; my@nums=qw/123543245/; my$max_length=shift反向排序映射{1+log$\/log10}@nums; printf%d\n,$max\u长度; 我得到了错误

现在禁止在@nums附近的第5行进行标量实验移位; 为什么shift认为它是通过标量上下文传递的参数传递的,而reverse和sort则不是

谢谢

注意这些文档是如何表达的

移位数组 移位

假设你没有给它一个数组一个变量,而是一个表达式,它会立即将其取消

他们后来对我的重点发表了评论

从Perl5.14开始,一个实验特性允许shift采用标量表达式。这个实验被认为是不成功的,从Perl 5.24开始就被删除了

很明显,您正在运行5.24或更新版本

要了解错误消息,请参阅文档了解旧版本,直到,以及

移位数组 移位表达式 移位

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

从Perl5.14开始,shift可以采用标量表达式,该表达式必须包含对非lessed数组的引用。参数将自动取消引用。这方面的转变被认为是高度实验性的

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

请注意,非负整数的长度可以通过取该字符串的

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;
注意文档是如何表示的

移位数组 移位

假设你没有给它一个数组一个变量,而是一个表达式,它会立即将其取消

他们后来对我的重点发表了评论

从Perl5.14开始,一个实验特性允许shift采用标量表达式。这个实验被认为是不成功的,从Perl 5.24开始就被删除了

很明显,您正在运行5.24或更新版本

要了解错误消息,请参阅文档了解旧版本,直到,以及

移位数组 移位表达式 移位

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

从Perl5.14开始,shift可以采用标量表达式,该表达式必须包含对非lessed数组的引用。参数将自动取消引用。这方面的转变被认为是高度实验性的

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

请注意,非负整数的长度可以通过取该字符串的

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;

错误消息具有误导性。它真正的意思是,你正在改变的东西不是一个变量。您可以使用my$scalar=shift 1,2,3得到相同的结果;当它分为两行时,移位的数组是@length。@RaymondChen它指的是旧版本,在旧版本中,除了数组之外,还可以将计算结果传递给arrayref的表达式。我认为暗示这一点的信息是为了提供信息,但我同意这一点可能只是误导。可能只是说“EXPR unsupported”之类。相关:错误消息具有误导性。它真正的意思是,你正在改变的东西不是一个变量。您可以使用my$scalar=shift 1,2,3得到相同的结果;当它分为两行时,移位的数组是@length。@RaymondChen它指的是旧版本,在旧版本中,除了数组之外,还可以将计算结果传递给arrayref的表达式。我认为暗示这一点的信息是为了提供信息,但我同意这一点可能只是误导。可以说“EXPR unsupported”之类。相关:使用lengt有什么不对
h获取长度?请注意,如果值是浮点值或使用指数表示法,拆分技术将崩溃。但如果您假设这些值都是不需要指数表示法的非负整数,那么首先计算最大值可能更快,然后作为最后一步计算长度:0+split,max@nums。@melpomene gulp,对。。。被我正在做的其他事情所困扰。。。修理它。。谢谢大家!@RaymondChen是的,我说整数的长度。。。我想这仍然为指数表示法留下了空间,但这应该是一个足够的提示。要理解错误消息,请参阅旧版本的文档,仅使用长度来获取长度有什么错?请注意,如果值是浮点或使用指数表示法,拆分技术将崩溃。但如果您假设这些值都是不需要指数表示法的非负整数,那么首先计算最大值可能更快,然后作为最后一步计算长度:0+split,max@nums。@melpomene gulp,对。。。被我正在做的其他事情所困扰。。。修理它。。谢谢大家!@RaymondChen是的,我说整数的长度。。。我想这仍然为指数表示法留下了空间,但这应该是一个足够的提示。要理解错误消息,请参阅旧版本的文档,