Ответ 1
Опция командной строки -n
преобразует код в нечто, эквивалентное
while ($ARGV = shift @ARGV) {
open ARGV, $ARGV;
LINE: while (defined($_ = <ARGV>)) {
$seen{$_} .= @ARGV;
print $_ if $seen{$_} =~ /10$/;
}
}
Пока первый файл читается, scalar @ARGV
есть 1
. Для каждой строки 1
будет добавлен в запись %seen
.
Пока считывается второй файл, scalar @ARGV
- 0
. Итак, если строка была в файле 1 и в файле2, запись будет выглядеть как 1110000
(это было 3 × в файле1, 4 × в файле2).
Мы хотим только вывести общие строки ровно один раз. Мы делаем это, когда общая строка сначала отображается в файле2, поэтому $seen{$_}
- 1110
. Это выражается как регулярное выражение /10$/
: строка 10
должна появиться в конце.