【问题标题】:Perl accessing the elements in a hash/hash reference data structurePerl 访问散列/散列引用数据结构中的元素
【发布时间】:2013-02-05 11:51:46
【问题描述】:

由于我是哈希和哈希引用的新手,我有一个问题希望您能提供帮助?

我有以下数据结构:

$VAR1 = {
    'http://www.superuser.com/' => {
        'difference' => {
            'http://www.superuser.com/questions' => '10735',
            'http://www.superuser.com/faq' => '13095'
        },
        'equal' => {
            'http://www.superuser.com/ ' => '20892'
        }
    },
    'http://www.stackoverflow.com/' => {
        'difference' => {
            'http://www.stackoverflow.com/faq' => '13015',
            'http://www.stackoverflow.com/questions' => '10506'
        },
        'equal' => {
            'http://www.stackoverflow.com/ ' => '33362'
        }
    }

如果我想访问键 'difference' 中的所有 URL,然后我可以对这些 URL 执行一些其他操作,那么访问这些元素的正确或首选方法是什么?

例如,我最终会得到以下 URL,然后我可以在 foreach 循环中执行以下操作:

http://www.superuser.com/questions
http://www.superuser.com/faq
http://www.stackoverflow.com/faq
http://www.stackoverflow.com/questions

--------编辑-----

访问上述数据结构下方元素的代码:

my @urls;
foreach my $key1 ( keys( %{$VAR1} ) ) {
    print( "$key1\n" );
    foreach my $key2 ( keys( %{$VAR1->{$key1}} ) ) {
        print( "\t$key2\n" );
    foreach my $key3 ( keys( %{$VAR1->{$key1}{$key2}} ) ) {
        print( "\t\t$key3\n" );
    push @urls, keys %{$VAR1->{$key1}{$key2}{$key3}};
    }
  }
}
print "@urls\n";

使用上面的代码为什么会出现以下错误?

Can't use string ("13238") as a HASH ref while "strict refs" in use at ....

【问题讨论】:

    标签: perl hash www-mechanize hash-of-hashes hashref


    【解决方案1】:

    不难,只需将变量中每个键的第二级键去掉即可:

    my @urls;
    for my $key (keys %$VAR1) {
        push @urls, keys %{$VAR1->{$key}{'difference'}};
    }
    

    如果您在解引用方面遇到困难,请记住哈希或数组中的所有值只能是标量值。在多级哈希或数组中,级别只是堆叠在一起的单个哈希/数组。

    例如,你可以这样做:

    for my $value (values %$VAR1) {
        push @urls, keys %{$value->{'difference'}};
    }
    

    或者

    for my $name (keys %$VAR1) {
        my $site = $VAR1->{$name};
        push @urls, keys %{$site->{'difference'}};
    }
    

    ..直接在值(对哈希的引用)或临时变量上采用路由,通过键表示值。 perldoc perldata 中还有更多内容可供阅读。

    【讨论】:

    • 感谢这正是我想要的。如果我只想访问每个stackoverflow url末尾的数字,即130151050633362,代码会是什么样子。我需要学习如何访问数据结构的不同部分,感谢您的帮助。
    • 如果我只想访问每个 stackoverflow url 末尾的数字,即 13015、10506 和 33362,你能告诉我代码是什么样的吗?非常感谢
    • @perl-user 很简单。键 'http://www.stackoverflow.com/' 的值是一个哈希引用。该哈希引用中的键是'difference''equal',它们的值也是哈希引用。这些哈希引用的值是您所追求的值。只需以这种方式堆叠for 循环,就可以了。如果您不确定发生了什么,请使用 Data::Dumper 检查您的结果。
    • 请您看一下我添加到我的问题中的编辑。这是否应该像您提到的那样完成 foreach 循环?还有为什么我会收到错误消息?非常感谢,你帮了很多忙
    • @perl-user 好吧,最里面的值不再是哈希引用,所以你不能这样使用它们。您只需按原样使用该值。顺便说一句,如果每个循环为结构中的特定步骤分配一个临时变量,您可以使事情变得更容易。例如。 for my $key (keys %$VAR1) { my $href1 = $VAR1->{$key}; for my $key2 (keys %$href1) ...
    猜你喜欢
    • 2013-01-29
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    • 2014-09-28
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 2013-05-09
    相关资源
    最近更新 更多