Есть ли в Perl встроенный способ сравнения двух массивов на равенство? - PullRequest
50 голосов
/ 22 октября 2009

У меня есть два массива строк, которые я хотел бы сравнить на равенство:

my @array1 = ("part1", "part2", "part3", "part4");
my @array2 = ("part1", "PART2", "part3", "part4");

Есть ли встроенный способ сравнения массивов, как для скаляров? Я попробовал:

if (@array1 == @array2) {...}

но он просто оценил каждый массив в скалярном контексте и сравнил длину каждого массива.

Я могу свернуть свою собственную функцию, чтобы сделать это, но это похоже на такую ​​низкоуровневую операцию, что должен быть встроенный способ сделать это. Есть ли?

Редактировать: к сожалению, у меня нет доступа к 5.10+ или дополнительным компонентам.

Ответы [ 13 ]

1 голос
/ 25 ноября 2009

Если корпус является единственной разницей, вы можете просто использовать:

if (lc "@array1" eq lc "@array2") {...}

Принимая во внимание, что "@array1" возвращает то же, что и join ( " ", @array1 )

0 голосов
/ 01 ноября 2016

Можно использовать функцию grep в скалярном контексте (http://perldoc.perl.org/functions/grep.html#grep-BLOCK-LIST)

(0 экв. (Grep {$ array1 [$ _] ne $ array2 [$ _]} 0 .. $ # array1)) если $ # array1 eq $ # array2;

Е.И.В..

0 голосов
/ 01 декабря 2011

Если единственным критерием является «они эквивалентны или нет?», А не более сложный вопрос, «эквивалентны они или нет, и если они отличаются, как?» Есть гораздо более быстрые / уродливые способы сделать это. Например, разбейте все массивы на два скаляра и сравните их.

Например

my @array1 = ("part1", "part2", "part3", "part4");
my @array2 = ("part1", "PART2", "part3", "part4");

my $smash1 = join("", @array1);
my $smash2 = join("", @array2);

if ($smash1 eq $smash2)
{
  # equal
}
else
{
  #unequal
}

Да, я, наверное, только что заставил Ларри Уолла плакать.

...