Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
解释在2个文件中显示公共行的perl代码_Perl - Fatal编程技术网

解释在2个文件中显示公共行的perl代码

解释在2个文件中显示公共行的perl代码,perl,Perl,这个perl一行程序如何显示两个文件共有的行 perl -ne 'print if ($seen{$_} .= @ARGV) =~ /10$/' file1 file2 @ARGV在打开第一个文件时被移位。在标量上下文中,它现在返回1(因为它有一个成员,即第二个文件)。对于每一行,这个1被附加到哈希%seen。打开第二个文件时,@ARGV再次移位,现在为空,因此在标量上下文中返回0/10$/表示“该行在文件1中看到,现在它第一次在文件2中看到”。命令行选项将代码转换为与 while ($AR

这个perl一行程序如何显示两个文件共有的行

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

@ARGV在打开第一个文件时被移位。在标量上下文中,它现在返回1(因为它有一个成员,即第二个文件)。对于每一行,这个1被附加到哈希%seen。打开第二个文件时,@ARGV再次移位,现在为空,因此在标量上下文中返回0
/10$/
表示“该行在文件1中看到,现在它第一次在文件2中看到”。

命令行选项将代码转换为与

while ($ARGV = shift @ARGV) {
  open ARGV, $ARGV;
  LINE: while (defined($_ = <ARGV>)) {
    $seen{$_} .= @ARGV;
    print $_ if $seen{$_} =~ /10$/;
  }
}
while($ARGV=shift@ARGV){
打开ARGV,$ARGV;
行:while(已定义($\u=)){
$seen{${}.=@ARGV;
打印$\if$seen{$\u}=~/10$/;
}
}
读取第一个文件时,
scalar@ARGV
1
。对于每一行,
1
将附加到所看到的
%条目中

在读取第二个文件时,
scalar@ARGV
0
。因此,如果一行在文件1和文件2中,条目将看起来像
1110000
(在文件1中是3倍,在文件2中是4倍)


我们只希望只输出一次公共行。当公共行第一次出现在文件2中时,我们就这样做了,因此
$seen{$}
1110
。这表示为正则表达式
/10$/
:字符串
10
必须出现在末尾。

非常全面的答案!我没有意识到,
@ARGV
随着文件的处理而改变。因此,当在其中分配一个条目时,
%seen
散列就出现了。散列项的默认值是什么,是空字符串吗?@Kelvin这里仍然有相当多的魔力。在更大的程序中,
使用strict
并在循环外声明
%hash
,使用
my%hash
。如果哈希项不存在,则值为
unde
null
或其他语言中的
nil
)。但当一个条目被视为字符串时,它就是空字符串。当数据结构(散列、数组)的值突然出现时,这就是所谓的。这对于创建复杂的数据结构或类似的计数内容特别有用。例如,
my%hash$散列{foo}{bar}=42
自动激活
foo
项中的散列。@amon:
=
将项视为字符串时,它是空字符串,而不是所有操作。很好的解释!同样的概念可以扩展到3个文件:
perl-ne'print if($seen{$\u}.=@ARGV)=~/2+1+0$/'file1 file2 file3