解释在2个文件中显示公共行的perl代码
这个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 -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