0

我有一个哈希哈希,即我的数据结构中的哈希和哈希引用。当我只有主哈希名称而没有最深哈希的键时,我可以遍历最深哈希吗?

my %gates_info=(
    'order' => {
        'nand' => {
            'nand2_1' =>2,
            'nand2_5' =>-1,
            'nand2_4' =>2,
            'nand2_6' =>-1,
            'nand2_2' =>2,
            'nand2_3' =>3
        },
        'and' => {
            'and2'=>1,
            'and3'=>2,
        },
    }
);

sub max_gate_order {
    print values (%{$gates_info{'order'}});
    my @arr = (sort {$a <=> $b} values %{$gates_info{'order'}});
    return $arr[-1];
}

当我只有它的名称 %gates_info 并且没有诸如“nand”或“and”之类的键时,我想遍历整个哈希。我想要实现的是通过排序获得每个门中的最高数值。比如nand case中的3和and case中的2。sub max_gate_order 用于排序和返回最大值。谢谢

4

3 回答 3

2

keys会给你那些钥匙。

sub max_gate_order {
   my ($gates_info) = @_;
   my $max_order;
   my @gates;
   for my $gate_type (keys %{ $gates_info->{order} }) {
      for my $gate_id (keys %{ $gates_info->{order}{$gate_type} }) {
         my $order = $gates_info->{order}{$gate_type}{$gate_id};
         $max_order //= $order;
         if ($order >= $max_order) {
            if ($order > $max_order) {
               $max_order = $order;
               @gates = ();
            }

            push @gates, $gate_id;
         }
      }
   }

   return @gates;
}

my @gates = max_gate_order(\%gates_info);

以上返回所有具有最高顺序的门。

如果您需要门类型和门 id,请替换

push @gates, $gate_id;

push @gates, [ $gate_type, $gate_id ];

或者

push @gates, [ $gate_type, $gate_id, $order ];
于 2019-04-18T11:38:56.667 回答
2

这是一个更长、更冗余的解决方案,实际上更像是一个练习。但是您可能会发现以这种方式检查哈希迭代的结构很有趣。(我知道我知道!)如果您只有主哈希名称 ( %gates_info),并且没有任何键,这可能很有用。这就是你的问题所暗示的情况。这会拉出与哈希一样深的所有键和值名称,以防其中任何一个可能有用。我还上传了一个工作示例。(请注意,这确实需要知道您的哈希有多少层。)

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;


my %gates_info=(
    'order' => {
        'nand' => {
            'nand2_1' =>2,
            'nand2_5' =>-1,
            'nand2_4' =>2,
            'nand2_6' =>-1,
            'nand2_2' =>2,
            'nand2_3' =>3
        },
        'and' => {
            'and2'=>1,
            'and3'=>2,
        },
    }
);
print Dumper %gates_info;
print "\n\n";

my @gate;
my $hival; 

foreach my $gate (sort keys %gates_info) {
 foreach my $gatekey (sort keys %{$gates_info{$gate}}) {
   foreach my $deepkey (sort keys %{$gates_info{$gate}{$gatekey}}) {
   my $deepvalue = $gates_info{$gate}->{$gatekey}->{$deepkey};
push @gate, $deepvalue;
@gate = sort @gate;
$hival = $gate[@gate - 1];
print "Gate is $gate, gatekey is $gatekey, deepkey is $deepkey, deepvalue is $deepvalue\n"; 
  } 
print "\nGatekey is $gatekey, highest value is $hival\n\n";
@gate = (); #empty gate array
 } 
}

exit 0;

代码的输出是:

$VAR1 = 'order';
$VAR2 = {
          'and' => {
                     'and2' => 1,
                     'and3' => 2
                   },
          'nand' => {
                      'nand2_3' => 3,
                      'nand2_6' => -1,
                      'nand2_4' => 2,
                      'nand2_5' => -1,
                      'nand2_2' => 2,
                      'nand2_1' => 2
                    }
        };


Gate is order, gatekey is and, deepkey is and2, deepvalue is 1
Gate is order, gatekey is and, deepkey is and3, deepvalue is 2

Gatekey is and, highest value is 2

Gate is order, gatekey is nand, deepkey is nand2_1, deepvalue is 2
Gate is order, gatekey is nand, deepkey is nand2_2, deepvalue is 2
Gate is order, gatekey is nand, deepkey is nand2_3, deepvalue is 3
Gate is order, gatekey is nand, deepkey is nand2_4, deepvalue is 2
Gate is order, gatekey is nand, deepkey is nand2_5, deepvalue is -1
Gate is order, gatekey is nand, deepkey is nand2_6, deepvalue is -1

Gatekey is nand, highest value is 3
于 2019-05-11T23:05:20.340 回答
0
sub max_gate_order {

    my %hash =();
    foreach my $k (keys %{$gates_info{'order'}}) {
        my @arr = (sort {$a <=> $b} values %{$gates_info{'order'}->{$k}});
        $hash{$k} = $arr[-1];       
    }   
    return \%hash;

}
于 2019-04-18T11:17:12.700 回答