无法解析Perl数组中的标量
我有一个对散列的 Perl 引用,该散列$conf将数组作为值之一。我可以通过以下方式检索它:
$conf->{group}->{names} # returns an array (NOT array ref)
但是当我将它存储在其他一些变量中时,我会得到这种不寻常的行为。
say ($conf->{group}->{names}); # some array ref
say ($conf->{group}->{names}[1]); # some string
my @list = $conf->{group}->{names};
say ($list[0]); # same array ref
这种行为的原因可能是什么?我想遍历这个数组,但使用foreach但因此无法这样做。
我想遍历数组的元素,但我不知道如何。
回答
您声称$conf->{group}->{names}是一个数组而不是对一个的引用,但这是不可能的。哈希值是标量;它们不能是数组。这就是我们将数组的引用存储在散列中的原因。
这$conf->{group}->{names}[1]作品(简称$conf->{group}->{names}->[1])表明$conf->{group}->{names}它是一个对数组的引用。[1]
您将此引用分配给@list,因此@list使用此引用填充。这就是为什么$list[0]这个参考。
您希望遍历数组的元素。如果你有一个命名数组,你会使用
for (@array) {
...
}
但是你有一个对数组的引用。有两种语法可用于实现这一点。
-
环绕语法具有一个返回引用的块
for (@{ $ref }) { # Or just @$ref when the block contains a simple scalar. ... }在你的情况下,
my $ref = $conf->{group}{names}[1]; for (@$ref) { ... }或者
for (@{ $conf->{group}{names}[1] }) { ... } -
后缀(又名“箭头”)语法特征可以附加到表达式上。
for ($ref->@*) { ... }在你的情况下,
my $ref = $conf->{group}{names}[1]; for ($ref->@*) { ... }或者
for ($conf->{group}{names}[1]->@*) { ... }->@*需要 Perl 5.24+。它在 Perl 5.20+ 中可用,方法是添加use feature qw( postderef );和no warnings qw( experimental::postderef );,或添加use experimental qw( postderef );. 这是安全的,因为当时的实验特性被 Perl 接受而没有改变。
请参阅Perl 取消引用语法及其链接的文档。
- 我假设你
use strict;像往常一样使用。