【问题标题】:How do I extract all array values from a hash of hashes如何从哈希哈希中提取所有数组值
【发布时间】:2013-02-11 18:42:44
【问题描述】:

这里是新手。如果我缺少详细信息,请致歉。

在 perl 5 中

我有一个类似这样的文件

precedence = 2
new york
new jersey
florida
precedence = 3
kings
essex
dade
precedence = 1
brooklyn
newark
miami

我没有问题遍历文件并创建一个保存优先级值的 $var 和一个保存行直到下一个“部分”(优先级 = x)的数组(@tmp)

我最终需要按照偏好的顺序将所有部分推入最终数组

所以

print @final;

结果

 brooklyn
 .....
 new york
 .....
 kings
 .....

注意:我从来不知道会有多少节或每个节有多少行

我想也许可以做一个哈希哈希并将每个数组放在 HoH 中

push @{ $hash{"section_2"} }, @tmp ;

但我不知道

a) 如果每次我加载一个部分时重用@tmp 数组会出现问题(在每个循环开始时将其消隐之后)

b) 我不知道如何在键“section_2”中获取数组中的所有值并将它们推送到@final

当然可能有更好的方法。

【问题讨论】:

    标签: arrays perl hash


    【解决方案1】:

    HoH 没有任何意义。如果您期望优先级有很大差异(1、1000000、1000000000),则可以使用 HoA,

    my $precedence = 0;
    my %data;
    while (<>) {
       chomp;
       if (/precedence\s*=\s*([0-9]+)\z/) {
          $precedence = $1;
          next;
       }
    
       push @{ $data{$precedence} }, $_;
    }
    
    my @final = map @{ $data{$_} }, sort { $a <=> $b } keys %data;
    

    但 AoA 很可能更适合。

    my $precedence = 0;
    my @data;
    while (<>) {
       chomp;
       if (/precedence\s*=\s*([0-9]+)\z/) {
          $precedence = $1;
          next;
       }
    
       push @{ $data[$precedence] }, $_;
    }
    
    my @final = map @$_, grep $_, @data;
    

    【讨论】:

    • 我知道你喜欢在一行代码中折叠很多东西,但我认为如果你将逻辑上单独的优先级值存储在数据结构中自己不同的空间中,并将值数组存储在另一个而不是规范地将第一个数组元素保留为优先级值,其余的是数组值。但话又说回来,我有注意力跨度问题,我必须让我的代码超级可读——大多数 perl 程序员在一行代码中塞满了太多功能,我无法理解它。
    • @foampile,我没有像你说的那样保留第一个数组元素。正如您建议的那样,我确实将逻辑上独立的优先级值存储在数据结构中自己不同的空间中。顶级散列或数组的每个元素都是对数组的引用。引用的数组只包含城市的名称。
    • @foampile,我真的无法有效地分解你不理解的部分,push @{ $data[$precedence] }, $_;
    • 谢谢!我会尝试根据您的建议。
    【解决方案2】:

    不太确定我是否完全理解您要完成的工作,但如果您想打印每个优先级值,然后打印其数组中的值,您可以试试这个:

    my $hoh;
    
    #This is not how you populate your HoH, I hard code it to simplify
    @{$hoh->{2}->{'ARRAY'}} = ('new york', 'new jersey', 'florida');
    @{$hoh->{3}->{'ARRAY'}} = ('kings', 'essex', 'dade');
    @{$hoh->{1}->{'ARRAY'}} = ('brooklyn', 'newark', 'miami');
    
    foreach my $prcdnc(keys(%$hoh))
    {
        print "\nprcdnc = ".$prcdnc;
    
        my @prcdncAry = @{$hoh->{$prcdnc}->{'ARRAY'}};
    
        my $prcdncAryStr = join(",", @prcdncAry);
    
        print "\n\t".$prcdncAryStr;
    }
    

    【讨论】:

    • 所有-&gt;{'ARRAY'} 都没用。没有理由为每个优先级创建一个元素的哈希。
    • 这实际上并不会产生所需的结果,而是一个具有按优先级排序的值的数组。
    • @{ $foo } = ( LIST ); 是一种愚蠢的做法 $foo = [ LIST ];
    • 为什么将变量命名为“array foo array”(例如@prcdncAry)?
    • 为什么一个城市数组命名为@prcdncAry
    猜你喜欢
    • 2013-01-23
    • 1970-01-01
    • 2012-02-19
    • 2011-04-20
    • 2020-07-21
    • 2016-05-29
    • 1970-01-01
    • 2010-12-19
    • 2013-03-05
    相关资源
    最近更新 更多