示例数据
my @array1 = qw(blah1 blah2);
my @array2 = split(';', 'Joe: creating "blah1";Bill: creating "blah2"');
以下前两行是您问题的解决方案
my @check = map { m/:.*?"(.*)"/g } @array2;
if (@array1 == @array2 && "@array1" eq "@check") {
# note that @array1 == @array2 is only done for efficiency;
# it would be sufficient to verify only that
# "@array1" eq "@check"
print "same\n";
} else {
print "different\n";
}
请注意,现在排序是安全的@array1
,@check
以防您的原始数组没有相应的顺序。(排序@array
并且@array2
只会破坏任何可能已经存在的订单,因为名称以 . 中的值作为前缀@array2
。)
my @check = map { m/:.*?"(.*)"/g } @array2;
my $i = 0;
if (@array1 == @array2) {
for (; $i < @array1; $i++) {
last if $array1[$i] ne $check[$i];
}
} else {
$i = -1;
}
if ($i == @array1) {
print "same\n";
} else {
print "different\n";
}
请注意,只有当您的数组不相同时,这个较长的代码才会更有效。如果通常情况下您希望数组的值相同,那么使用较长的代码没有任何好处。
顺便说一句:那个正则表达式看起来很粗心,但根据 OP,它正是我们想要的,特别是如果 blah1、blah2 等可能包含额外的双引号。如果我们确定没有名称包含引号,那么我们可以删除:.*?
并"(.\*)"
单独执行,这样会更快。