我试图:
#!/usr/bin/env perl
use 5.038;
use warnings FATAL => 'all';
use autodie ':all';
use Devel::Confess 'color';
while (my ($i, $t) = each('a','b','c')) {
say "$i, $t";
}
但我收到错误:
Experimental each on scalar is now forbidden
('a','b','c')
是一个标量?
我真的很喜欢 Perl 的each
数组,因为我不必声明迭代器变量。
我也尝试过
while (my ($i, $t) = each(('a','b','c'))) {
while (my ($i, $t) = each(qw('a','b','c'))) {
但得到同样的错误。
while (my ($i, $t) = each(@{ ('a','b','c') }) {
但上面给出了一个错误:Useless use of a constant ("a") in void context
这是我从如何解决 perl 中的“现在禁止标量上的实验值”问题得到的
我怎样才能让 Perl 相信each
('a','b','c') 是一个数组?
你不能,因为
('a','b','c')
它只是字符串文字(标量)的列表。它不是数组变量。每个文档都很清楚
所以它需要一个变量,可以是哈希值,也可以是数组。
还有出现错误的问题
首先,我收到的此类代码的完整错误消息
有启发性
该功能
each
已原型化,所以它需要一个项目,该项目需要是散列或数组变量。通过向它传递一个列表,我们得到了一个不匹配的情况,它在编译时被捕获,并且应该是致命的。那么游戏就结束了。
然而,我相信这是一种额外的礼貌,我们还收到了有关“标量上的每个实验”的消息。
问题是,如果原型中的这种不匹配通过(不是致命的),那么列表
'a', 'b', 'c'
将是一个要计算的表达式,它会产生三个标量或一个标量(通过逗号运算符,前两项将被丢弃,并且表达式返回'c'
,或者,如果优先级相反,'a'
则返回并丢弃其余部分),具体取决于上下文。在任何一种情况下,标量都将用于
each
,过去被允许然后被警告然后被彻底禁止,所以我们(仍然)收到一条额外的消息。('a','b','c')
不是数组;这是一个列表。请参阅每个.如果将列表分配给数组变量,它将起作用:
输出: