看看这段代码。经过数小时的反复试验。我终于得到了解决方案。但是不知道它为什么会起作用,而且说实话,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};
我完全糊涂了。我真的很感激能够解释这里发生了什么的人,所以我知道未来。提前谢谢。
答案 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}}是一个参考,您必须通过提到的密钥访问这些值。