优化perl哈希乱

时间:2012-03-13 20:58:25

标签: perl hash

我有Perl代码,看起来很乱:

         my $x = $h->[1];
         foreach my $y (keys %$x) {
           my $ax = $x->{$y};
           foreach my $ay (keys %$ax) {
             if (ref($ax->{$ay}) eq 'JE::Object::Proxy') {
               my $bx = $ax->{$ay};
               if ($$bx->{class_info}->{name} eq 'HTMLImageElement') {
                 print $$bx->{value}->{src}, "\n";
               }
             }
           }
         }

是否可以优化上面的代码,不使用任何变量,只需$h,因为那是一个输入?

4 个答案:

答案 0 :(得分:4)

这是我对它的抨击:

print $$_->{value}{src}, "\n" for grep {
    ref $_ eq 'JE::Object::Proxy' &&
    $$_->{class_info}{name} eq 'HTMLImageElement'
} map {
    values %$_
} values %{ $h->[1] };

答案 1 :(得分:3)

通过减少行数并最大限度地减少嵌套代码的数量,可以清除许多“混乱”。使用each命令从一行中的哈希值中获取下一个键及其关联值。 [编辑:正如Axeman指出的那样,你真的只需要这些值,所以我用each替换我对values的使用。另外,使用一对next语句跳过print语句。

for my $ax (values %{$h->[1]} ) {
    for my $bx (values %$ax ) {
        next unless ref($bx) eq 'JE::Object::Proxy';
        next unless $$bx->{class_info}->{name} eq 'HTMLImageElement';
        print "$$bx->{value}->{src}\n";
    }
}

答案 2 :(得分:3)

当你真正想要values时,你正在使用密钥。

foreach my $h ( grep { ref() eq 'HASH' } values %$x ) { 
    foreach my $obj ( 
        grep {   ref()                  eq 'JE::Object::Proxy' 
             and $_->{class_info}{name} eq 'HTMLImageElement' 
             } values %$h 
        ) { 
        say $obj->{value}{src};
    }
}

答案 3 :(得分:0)

只需删除帮助变量很容易,这样就应该这样做:

foreach my $y (keys %{$h->[1]}) {
  foreach my $ax (%{$h->[1]->{$y}) {
    foreach my $ay (keys %$ax) {
      if(ref($h->[1]->{$y}->{$ay}) eq 'JE::Object::Proxy') {
        if($h->[1]->{$y}->{$ay}->{class_info}->{name} eq 'HTMLImageElement') {
          print $h->[1]->{$y}->{$ay}->{value}->{src}, "\n";
        }
      }
    }
  }
}

您还可以删除重复的if:

foreach my $y (keys %{$h->[1]}) {
  foreach my $ax (%{$h->[1]->{$y}) {
    foreach my $ay (keys %$ax) {
      if(ref($h->[1]->{$y}->{$ay}) eq 'JE::Object::Proxy' && $h->[1]->{$y}->{$ay}->{class_info}->{name} eq 'HTMLImageElement') {
        print $h->[1]->{$y}->{$ay}->{value}->{src}, "\n";
      }
    }
  }
}

但我真的没有看到如何让它更具可读性:它是对三维结构的迭代。