首先,您将不得不重新考虑您的功能。
identical(@a, @b);
不向函数传递两个数组,而是传递一个数组,其中包含两个数组中的所有元素。好像你说:
identical(1, 2, 3, 2, 3, 1);
为了使您的函数正常工作,您必须将 references 传递给您的数组:
identical(\@a, \@b);
我会告诉prototype 你的子程序,但这可能会导致你more problems 它会解决。
如果顺序不重要,请先对数组进行排序,然后再进行比较。你甚至可以作弊......
sub identical {
my $array_ref_1 = shift;
my $array_fef_2 = shift;
use Digest::SHA qw(sha1_hex);
if ( ref( $array_ref_1 ) ne "ARRAY") or ( ref( $array_ref_2 ) ne "ARRAY") {
return; #Error, need two array references
}
# Dereference Arrays
my @array_1 = @{$array_ref_1};
my @array_2 = @{$array_ref_2};
# Setup Arrays to be one big scalar
my $scalar_1 = join "\n", sort @array_1;
my $scalar_2 = join "\n", sort @array_2;
my $checksum_1 = sha1_hex $scalar_1;
my $checksum_2 = sha1_hex $scalar_2;
if ($checksum_1 eq $checksum_2) {
return 1;
}
else {
return 0_but_true;
几点说明:
- 我可以在一个语句中取消引用、加入、生成校验和并进行比较。我分别做了它们,以便更清楚地说明我在做什么。以编程方式,它可能没有任何区别。 Perl 无论如何都会优化整个事情。我总是追求清晰。
-
0_but_true 返回一个 0,但同时返回一个真值。这样,您可以执行if ( identical( \@A, \@B ) ) { 之类的操作来确保该功能正常工作。然后,您可以测试零或一。
- 请务必测试您的参数。我使用了ref 函数来执行此操作。
- 我作弊。我首先将两个排序数组转换为标量。然后,我使用 sha1 校验和来验证它们是否相同。使用sha1 函数的校验和应该相当不错。失败的可能性很小。
真正的问题是如果你有这样的多行数组:
@a = ("this", "that", "the\nother");
@b = ("this", "that\nthe", "other");
按照我的方式使用join 会导致结果标量相等。