这个 perl 单行如何显示 2 个文件共有的行?
perl -ne 'print if ($seen{$_} .= @ARGV) =~ /10$/' file1 file2
命令行选项将-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
(在文件 1 中是 3×,在文件 2 中是 4×)。
我们只想准确地输出公共线一次。当第一次在 file2 中看到公共行时,我们会这样做,$seen{$_}
所以1110
. 这表示为正则表达式/10$/
:字符串10
必须出现在末尾。
打开第一个文件时,@ARGV 会移动。在标量上下文中,它现在返回 1(因为它有一个成员,即第二个文件)。对于每一行,这个 1 被附加到散列 %seen。打开第二个文件时,@ARGV 再次移动,现在为空,因此在标量上下文中返回 0。/10$/
表示“该行已在 file1 中看到,现在它已首次在 file2 中看到”。