寻求解释神奇的Perl共享行Oneliner

寻求解释神奇的Perl共享行Oneliner,perl,Perl,我发现了这个(如果你一定要知道的话),它引起了我的注意 $ 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-ne'print i

我发现了这个(如果你一定要知道的话),它引起了我的注意

$ 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-ne'print if($seen{$}.=@ARGV)=~/10$/'
  • 表达式
    $seen{$}.=@ARGV
    @ARGV
    中的元素数附加到
    $seen{$}

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

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

  • $\uuu
    的值用作
    %seen
    散列的键,是从任一文件读取的最新一行

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

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

  • 如果两个文件中都出现了任何给定的行,则会在哈希元素中追加一个
    1
    ,然后再追加一个
    0
    ,将其设置为
    10

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

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


好的。。所以这个(这里的许多项目之一)我不知道。。。如果程序只有一行,那么它将用作每个参数上的行过滤器(连续读取每个参数)?所以本质上我们有一个双重嵌套的循环。都是含蓄的。哇。@StevenLu:
-n
选项为从输入文件读取的每一行执行代码。这只是一个单独嵌套的循环,因为文件是按顺序读取的,就像它们是连接在一起的一样。Perl将另一个文件名移出
@ARGV
,并在每次需要更多数据时打开它。哦,好的,我忽略了
-n
标志的重要性。现在不那么令人惊讶了。