如何使用Perl操作hash-ref



看看这段代码。经过数小时的反复试验。我终于找到了解决办法。但我不知道它为什么能工作,老实说,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};我完全糊涂了。我真的很感谢任何能解释这里发生了什么的人,这样我将来就会知道了。提前谢谢。

$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

像您所做的那样,在大括号内使用带有单个元素的哈希切片表示法并不是典型的用法,它会意外地为您提供所需的结果。

Diff函数返回一个散列引用。您正在通过提取哈希的一个元素切片(而不是正确的$out->{uniq_a}(来访问此哈希中具有关键字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] ];
}

Data::Diff的文档中,它指出:

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

因此$out是一个引用,您必须通过上述键访问这些值。

最新更新