1

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

4

3 回答 3

4

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

$out->{uniq_a}

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

%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

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

于 2013-01-10T20:04:35.873 回答
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] ];
}
于 2013-01-10T20:06:26.123 回答
1

在它的文档Data::Diff指出:

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

参考也是如此$out,您必须通过上述键访问值。

于 2013-01-10T20:02:11.913 回答