这两个文件的perl单行显示行如何共同?
perl -ne 'print if ($seen{$_} .= @ARGV) =~ /10$/' file1 file2
答案 0 :(得分:26)
-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
必须出现在最后。
答案 1 :(得分:3)
打开第一个文件时会移动@ARGV。在标量上下文中,它现在返回1(因为它有一个成员,第二个文件)。对于每一行,此1将附加到所见的哈希值。打开第二个文件时,@ ARGV再次移动并且现在为空,因此在标量上下文中返回0。 /10$/
表示“在file1中看到该行,现在它已在file2中首次出现”。