看看这段代码。经过数小时的反复试验。我终于找到了解决办法。但我不知道它为什么能工作,老实说,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
是一个引用,您必须通过上述键访问这些值。