解释这个perl代码,它显示2个文件中的公共行

时间:2013-07-09 15:55:30

标签: perl

这两个文件的perl单行显示行如何共同?

perl -ne 'print if ($seen{$_} .= @ARGV) =~ /10$/'  file1 file2

2 个答案:

答案 0 :(得分:26)

-n命令行选项将代码转换为等同于

的代码
while ($ARGV = shift @ARGV) {
  open ARGV, $ARGV;
  LINE: while (defined($_ = <ARGV>)) {
    $seen{$_} .= @ARGV;
    print $_ if $seen{$_} =~ /10$/;
  }
}

在阅读第一个文件时,scalar @ARGV1。对于每一行,1将附加到%seen条目。

在阅读第二个文件时,scalar @ARGV0。因此,如果一行在文件1和文件2中,则该条目看起来像1110000(文件1中为3×,文件2中为4×)。

我们只希望一次输出公共线。我们在file2中首次看到公共行时执行此操作,因此$seen{$_}1110。这表示为正则表达式/10$/:字符串10必须出现在最后。

答案 1 :(得分:3)

打开第一个文件时会移动@ARGV。在标量上下文中,它现在返回1(因为它有一个成员,第二个文件)。对于每一行,此1将附加到所见的哈希值。打开第二个文件时,@ ARGV再次移动并且现在为空,因此在标量上下文中返回0。 /10$/表示“在file1中看到该行,现在它已在file2中首次出现”。