寻求Magic Perl Shared Lines Oneliner的解释

时间:2015-08-13 01:54:54

标签: perl

我发现了这个(here,如果你必须知道的话),它引起了我的注意。

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

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

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

似乎只是吐出了共享输入文件的行。现在把每一行都放入哈希作为键或其他东西,我可以看到它如何帮助实现这个任务,但是......那个正则表达式到底是怎么回事?

再考虑一下,对.=的使用一无所知也是显而易见的。

1 个答案:

答案 0 :(得分:6)

  • 表达式$seen{$_} .= @ARGV@ARGV中的元素数量附加到$seen{$_}

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

  • 在读取第二个文件时,@ARGV为空

  • $_的值,用作%seen哈希的键,是从任一文件读取的最新行

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

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

  • 如果两个文件中都显示任何给定的行,则会将10附加到哈希元素,并将其设置为10

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

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