作者:夹uh山下 | 来源:互联网 | 2023-09-14 09:36
我有一个对散列的 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;
像往常一样使用。