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

Kel*_*vin 24 perl

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

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

amo*_*mon 27

-n命令行选项转换代码的东西等同于

while ($ARGV = shift @ARGV) {
  open ARGV, $ARGV;
  LINE: while (defined($_ = <ARGV>)) {
    $seen{$_} .= @ARGV;
    print $_ if $seen{$_} =~ /10$/;
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

我们只希望一次输出公共线.我们这样做的时候共用线file2中是第一次看到,所以$seen{$_}1110.这表示为正则表达式/10$/:字符串10必须出现在结尾处.

  • 这是如此令人难以置信的hackish,并没有很好的方式. (4认同)
  • @Kelvin这里还有相当多的魔法.在一个更大的程序中,可以使用strict`并在循环外用`my%hash`声明`%hash`.如果不存在哈希条目,则值为"undef"(其他语言中为"null"或"nil").但是当条目被视为字符串时,它是空字符串.因此它意味着我的意思. (2认同)
  • 很好的解释!相同的概念可以扩展到3个文件:`perl -ne'print if($ seen {$ _}。= @ARGV)=〜/ 2 + 1 + 0 $ /'file1 file2 file3` (2认同)