热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

无法解析Perl数组中的标量

我有一个对散列的Perl引用,该散列$conf将数组作为值之一。我可以通过以下方式检索它:$conf->{group}->

我有一个对散列的 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;像往常一样使用。







推荐阅读
author-avatar
夹uh山下
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有