提问人:con 提问时间:11/14/2023 最后编辑:tooliccon 更新时间:11/14/2023 访问量:142
我怎样才能将Perl的每个与列表一起使用?
How can I use Perl's each with a list?
问:
我正在尝试:
#!/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') }) {
但上面给出了一个错误:我从如何解决 perl 中的“标量实验值现在被禁止”问题中得到Useless use of a constant ("a") in void context
我怎样才能说服Perl的('a','b','c')是一个数组?each
答:
('a','b','c')
不是数组;这是一个列表。请参阅每个。
如果将列表分配给数组变量,它将起作用:
my @array = ('a','b','c');
while (my ($i, $t) = each(@array)) {
say "$i, $t";
}
输出:
0, a
1, b
2, c
我怎样才能说服Perl的每个('a','b','c')是一个数组?
你不能,因为只是一个字符串文字(标量)的列表。它不是一个数组变量。('a','b','c')
每个文档都很清楚
每个哈希
每个 ARRAY
...
所以它需要一个变量,要么是哈希,要么是数组。
还有一个错误出现的问题
但我收到一个错误:
Experimental each on scalar is now forbidden
('a','b','c')
是标量吗?
首先,我收到的此类代码的完整错误消息
perl -wE'while( my ($i, $t) = each(qw(a b c)) ) { say "$i, $t" }'
很有启发性
Experimental each on scalar is now forbidden at -e line 1.
Type of arg 1 to each must be hash or array (not list) at -e line 1, near "qw(a b c)) "
Execution of -e aborted due to compilation errors.
该函数已原型化,each
perl -wE'say prototype "CORE::each"' #--> \[%@]
所以它需要一个项目,它需要是一个哈希或数组变量。通过向它传递一个列表,我们有一个在编译时捕获的不匹配,并且应该是致命的。所以游戏就这样结束了。
然而,我相信这是一个额外的礼貌,我们也得到了关于“在标量上进行实验”的信息。
问题是,如果原型中的这种不匹配通过(不是致命的),那么列表将是一个要计算的表达式,它产生三个标量或一个标量(通过逗号运算符,前两个项目被丢弃,表达式返回,或者,如果优先级相反,则返回其余部分), 取决于上下文。'a', 'b', 'c'
'c'
'a'
在任何一种情况下,标量都用于 ,过去允许然后警告不要,然后完全禁止,因此我们(仍然)收到额外的消息。each
评论
perl -wE'say prototype "CORE::each"'
\[%@]
each
do
eval
\[%@]
\[%@]
评论
qw(a b c)
qw('a','b','c')
@{...}
@{[ qw(a b c) ]}
[...]
each
@
my $i = 0; for my $t (@arr) { ...; $i++ }
for (my ($i, $t) = each @arr) { ... }
each ARRAY
each