我如何使用Perl的每个列表?

qzlgjiam  于 11个月前  发布在  Perl
关注(0)|答案(2)|浏览(112)

我试着:

#!/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";
}

字符串
但我得到一个错误:
第一个月
('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,我从how to solve the “Experimental values on scalar is now forbidden” problem in perl得到的
我如何说服Perl的each('a','b ','c')是一个数组?

rggaifut

rggaifut1#

我怎样才能说服Perl的each that('a','b ','c')是一个数组?
你不能,因为('a','b','c')只是一个字符串字面量(标量)的列表,它不是一个数组变量。
each的配置文件已清除
每个散列
每个阵列
...
所以它需要一个变量,一个哈希或一个数组。
还有一个问题,
但我得到一个错误:
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,过去允许然后警告然后完全禁止,所以我们(仍然)得到一条额外的消息。

j13ufse2

j13ufse22#

('a','b','c')不是一个数组;它是一个列表。参考each
如果你将列表赋给一个数组变量,它将工作:

my @array = ('a','b','c');
while (my ($i, $t) = each(@array)) {
    say "$i, $t";
}

字符串
输出量:

0, a
1, b
2, c

相关问题