【问题标题】:Seeking explanation of Magic Perl Shared Lines Oneliner求Magic Perl Shared Lines Oneliner的解释
【发布时间】:2015-08-13 01:54:53
【问题描述】:

我发现了这个(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

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

再想一想,.= 的使用也不是很明显。

【问题讨论】:

    标签: perl


    【解决方案1】:
    • 表达式$seen{$_} .= @ARGV@ARGV 中的元素数量附加到$seen{$_}

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

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

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

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

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

    • 如果任何给定的行出现在两个文件中,10 将被附加到哈希元素,并将其设置为 10

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

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

    【讨论】:

    • OK.. 所以这个(这里的许多项目之一)我不知道......如果程序是一行,那么它被用作每个 arg 上的行过滤器(读取每个 arg陆续)?所以本质上我们有一个双重嵌套循环。都是隐含的。哇。
    • @StevenLu:-n 选项为从输入文件读取的每一行执行代码。这只是一个单嵌套循环,因为文件是按顺序读取的,就好像它们是串联的一样。 Perl 将另一个文件名从@ARGV 移出,并在每次需要更多数据时打开它
    • 哦,好吧,我错过了-n 标志的重要性。现在不那么令人惊讶了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 2017-07-21
    相关资源
    最近更新 更多