【问题标题】:Print the value in Hash of Hash for two different keys in Perl打印 Perl 中两个不同键的 Hash of Hash 中的值
【发布时间】:2014-11-04 22:19:18
【问题描述】:

下面是 Perl 中的哈希:

my %hash = (
            'episode1' => {
                            'when' => '08.13.97',
                            'airdate' => '08.13.97',
                            'episodenumber' => '101',
                            'id' => '103511',
                            'title' => 'Cartman Gets an Anal Probe',
                            'available' => 'true'
                          },
            'episode2' => {
                            'when' => '08.20.97',
                            'airdate' => '08.20.97',
                            'episodenumber' => '102',
                            'id' => '1035156',
                            'title' => 'Weight Gain 4000',
                            'available' => 'true'
                          }
);

我想打印两集的“id”,但下面的代码不起作用:

foreach my $key1 ( keys %hash ) {
  foreach my $key2 ( keys %{$hash{$key1}} ) {
    print "$hash{$key1}{$key2}{id}\n";
  }
}

请帮忙。

【问题讨论】:

    标签: perl hash


    【解决方案1】:

    问题是您尝试打印不存在的内容:没有与$hash{$key1}{$key2}{id} 匹配的值。

    试试这个代码,它会打印出哈希值,其中包含键“id”:

    use strict;
    use warnings;
    
    for my $episode (keys %hash){
        print "$hash{$episode}{id}\n";  
    }
    

    103511
    1035156
    

    【讨论】:

      【解决方案2】:

      尝试使用map

      my @ids = map { $hash{$_}{"id"} } sort keys %hash;
      

      或者,如果您仍然需要将结果作为哈希:

      my %ids_by_key = map { ($_, $hash{$_}{"id"}) } keys %hash;
      

      【讨论】:

      • 值得注意的是,如果您尝试存储 ID 以供以后迭代/使用,则此答案是可行的方法。如果您不需要将这些数据保存在数据结构中而只需要迭代打印,那么其他两个答案更简单。
      【解决方案3】:

      试试这个:

      foreach my $key1 ( keys %hash ) {
          print "$hash{$key1}{id}\n";
      }
      

      foreach my $key1 ( keys %hash ) {
        foreach my $key2 ( keys %{$hash{$key1}} ) {
          print "$hash{$key1}{$key2}\n" if($key2 eq 'id');
        }
      }
      

      【讨论】:

      • 这不是我的投票,但我猜这是因为您提供了解决问题的代码,但没有解释原始代码有什么问题或为什么新代码有效。
      • 感谢您的评论。这是第一次完美的代码被否决。显然每个地方都有白痴。
      • @Andrey 称不同意你的人为“白痴”并不好。如果用户认为答案没有用,我可以理解为什么会出现反对票。分歧在于什么是“有用的”:工作代码是有用的,解释也是如此。一个用户重视解释这一事实并不会使该用户成为白痴。
      • 感谢白金 Azure 的评论。
      • @Platinum Azure:我来这里不是为了友善或粗鲁。我会尽我所能帮助人们,并在需要时寻求帮助。根据定义,解决问题的解决方案是有用的。我真的很想知道有多少无用的答案被接受为正确的解决方案。
      猜你喜欢
      • 1970-01-01
      • 2012-04-19
      • 1970-01-01
      • 1970-01-01
      • 2013-12-03
      • 1970-01-01
      • 2016-02-04
      • 1970-01-01
      • 2020-09-12
      相关资源
      最近更新 更多