无法解析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) {
   ...
}

但是你有一个对数组的引用。有两种语法可用于实现这一点。

  1. 环绕语法具有一个返回引用的块

    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] }) {
       ...
    }
    
  2. 后缀(又名“箭头”)语法特征可以附加到表达式上。

    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 取消引用语法及其链接的文档。


  1. 我假设你use strict;像往常一样使用。

以上是无法解析Perl数组中的标量的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>