Cравнить два списка — задача, которую без привлечения модулей (например, List::Compare) в перле решать не очень удобно.
Начинающих может удивить, что выражение @a == @b сравнивает не сами списки, а их размер.
С приходом Perl 5.10 возникает соблазн использовать для сравнения двух списков оператор смарт-матчинга (~~):
say @a ~~ @b;
Это хорошо работает до тех пор, пока в списках содержатся скаляры, например:
my @a = (1, 3, 5);
my @b = (1, 3, 5);
say @a ~~ @b; # 1
Однако следует помнить, что (по крайней мере, начиная с версии 5.10.1), операция сопоставления списков последовательно сопоставляет соответствующие элементы списков, используя тот же оператор ~~.
Поэтому следующий пример тоже напечатает единицу, хотя исходные списки — разные:
my @a = (1, 3, 5);
my @b = (1, qr/\d/, 5);
say @a ~~ @b; # 1
Собственно вопрос:
А каким языке удобно сравнивать смешанные списки малым количеством кода? =)
Что имеется в виду под смешанными списками?
Смешанные списки - списки имеющие данные разных типов, как приведено в последнем примере.
P.S. просто меня первый абзац задел (про то что в Perl это делать не очень удобно) , ибо пока ничего удобнее чем Perl для подобных целей я не видел и не слышал.
P.P.S. хорошо осознаю чей это блог и о чём идёт речь в посте =)
Я говорил лишь про то, что используя ~~ можно попасть в ловушку, ошибочно посчитав, что этот оператор подходит для сравнения списков.