如何用Perl操作hash-ref?

时间:2013-01-10 19:54:14

标签: perl

看看这段代码。经过数小时的反复试验。我终于得到了解决方案。但是不知道它为什么会起作用,而且说实话,Perl在这里给我一个循环。

use Data::Diff 'Diff';
use Data::Dumper;

my $out = Diff(\@comparr,\@grabarr);

my @uniq_a;

@temp = ();
my $x = @$out{uniq_a};
foreach my $y (@$x) {
    @temp = ();
    foreach my $z (@$y) {
        push(@temp, $z);
    }
    push(@uniq_a, [$temp[0], $temp[1], $temp[2], $temp[3]]);
}

为什么我可以访问$ out数组元素的唯一方法是将一个哈希键传递给一个标量,该标量使用for循环转换为数组? my $x = @$out{uniq_a};我完全糊涂了。我真的很感激能够解释这里发生了什么的人,所以我知道未来。提前谢谢。

3 个答案:

答案 0 :(得分:4)

$out是哈希引用,您使用解除引用运算符->{...}来访问它引用的哈希的成员,例如

$out->{uniq_a}

你偶然发现的是Perl的哈希切片表示法,你在哈希名称前面使用@ sigil来方便地从该哈希中提取值列表。例如:

%foo = ( a => 123, b => 456, c => 789 );
$foo = { a => 123, b => 456, c => 789 };
print @foo{"b","c"};    # 456,789
print @$foo{"c","a"};   # 789,123

使用哈希切片表示法与大括号内的单个元素一样,不是典型用法,而是偶然为您提供所需的结果。

答案 1 :(得分:2)

Diff函数返回哈希引用。您正在通过提取哈希的单元素片段而不是正确的uniq_a来访问具有键$out->{uniq_a}的此哈希的元素。您的代码应如下所示

my $out = Diff(\@comparr, \@grabarr);

my @uniq_a;
my $uniq_a = $out->{uniq_a};
for my $list (@$uniq_a) {
  my @temp = @$list;
  push @uniq_a, [ @temp[0..3] ];
}

答案 2 :(得分:1)

Data::Diff $out中声明:

  

返回的值始终是哈希引用,哈希将具有   一个或多个以下哈希键:type,same,diff,diff_a,   diff_b,uniq_a和uniq_b

所以{{1}}是一个参考,您必须通过提到的密钥访问这些值。