如何让Perl的each函数正确识别列表?解决标量报错问题
问题解答
为什么('a','b','c')会被识别为标量?
Perl的each函数仅接受单个数组或哈希作为参数,不能直接传入列表。当你写each('a','b','c')时,列表会被“扁平化”处理——Perl会将列表的最后一个元素('c')作为标量传递给each,这就触发了新版本Perl禁用的“对 scalar 使用each”的实验性特性,从而报错。
你尝试的each(('a','b','c'))和each(qw('a','b','c'))本质上和直接传列表没有区别,内层列表依然会被扁平化,each还是只拿到最后一个元素作为标量,所以报错相同。而each(@{ ('a','b','c') })的错误在于,('a','b','c')是普通列表,不能直接用@{}解引用(解引用需要数组引用),Perl会丢弃列表前两个元素,只把最后一个元素当成无效的引用处理,因此报“Useless use of a constant”错误。
如何让each识别('a','b','c')为数组?
有两种简单的解决方式:
1. 先将列表赋值给数组变量
这是最直观的写法,将列表存入数组后再传给each:
#!/usr/bin/env perl use 5.038; use warnings FATAL => 'all'; use autodie ':all'; use Devel::Confess 'color'; my @items = ('a','b','c'); while (my ($i, $t) = each @items) { say "$i, $t"; }
2. 使用匿名数组引用解引用
通过[ ... ]创建匿名数组的引用,再用@{}解引用成数组直接传给each:
#!/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"; }
两种写法都能让each正确识别为数组,返回索引和对应的值,满足你无需手动管理迭代器的需求。
内容的提问来源于stack exchange,提问作者con
相关产品推荐
相关产品推荐

