寻求Magic Perl Shared Lines Oneliner的解释

Ste*_* Lu 2 perl

我发现这个(在这里,如果你必须知道),它引起了我的注意.

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

我知道perl.但我不知道它是如何做到的.

$ perl -ne 'print if ($seen{$_} .= @ARGV) =~ /10$/' <(echo 'zz\nabc\n3535\ndef') <(echo 'abc\ndef\nff')
abc
def
Run Code Online (Sandbox Code Playgroud)

看起来它只是吐出了共享的输入文件的行.现在将每一行放入哈希作为键或其他内容,我可以看到它如何帮助实现该任务,但是......那个正则表达式到底是怎么回事?

再考虑一下,使用它也不.=是很明显.

Bor*_*din 6

  • 表达式$seen{$_} .= @ARGV将元素的数量追加@ARGV$seen{$_}

  • 在读取第一个文件时,@ARGV只包含一个元素 - 第二个文件名

  • 在读取第二个文件时,它@ARGV是空的

  • 的价值$_,这是用来作为主要%seen的散列,从任意文件中读取到的最新行

  • 如果任何给定的行仅出现在第一个文件中,则只有一个1将附加到哈希元素

  • 如果任何给定的行仅出现在第二个文件中,则只有一个0将附加到哈希元素

  • 如果两个文件中都出现任何给定的行,则a 1和a 0将附加到哈希元素,并将其设置为10

  • 在读取第二个文件时,如果附加的0字符结果为值,10则打印该行

  • 这会导致两个文件中出现的所有行都打印到输出中