我发现了这个(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
似乎只是吐出了共享输入文件的行。现在把每一行都放入哈希作为键或其他东西,我可以看到它如何帮助实现这个任务,但是......那个正则表达式到底是怎么回事?
再考虑一下,对.=
的使用一无所知也是显而易见的。
答案 0 :(得分:6)
表达式$seen{$_} .= @ARGV
将@ARGV
中的元素数量附加到$seen{$_}
在读取第一个文件时,@ARGV
只包含一个元素 - 第二个文件名
在读取第二个文件时,@ARGV
为空
$_
的值,用作%seen
哈希的键,是从任一文件读取的最新行
如果任何给定的行仅出现在第一个文件中,则只有1
将附加到哈希元素
如果任何给定的行仅出现在第二个文件中,则只有0
将附加到哈希元素
如果两个文件中都显示任何给定的行,则会将1
和0
附加到哈希元素,并将其设置为10
在阅读第二个文件时,如果附加的0
字符的值为10
,则会打印该行
这会导致两个文件中出现的所有行都打印到输出