如何使用 Perl 将文件中第一次出现的行放入 %hash 中?
Posted
技术标签:
【中文标题】如何使用 Perl 将文件中第一次出现的行放入 %hash 中?【英文标题】:How to put the first occurence of a line in a file into a %hash with Perl? 【发布时间】:2014-06-22 18:24:07 【问题描述】:例如,给定这个数据:
ID1 2 3 4
ID1 2 4 5
ID2 2 6 8
ID2 4 6 7
ID3 3 5 6
我想读取一个文件句柄并在第一行遍历它,直到 ID 与前一个 ID 不匹配,然后继续直到文件末尾,所以我的输出文件如下所示:
ID1 2 3 4
ID2 2 6 8
ID3 3 5 6
非常感谢任何帮助。谢谢你。
【问题讨论】:
【参考方案1】:perl -ane '$s$F[0]++ or print' file
【讨论】:
【参考方案2】:use warnings;
use strict;
use Data::Dumper;
open my $in, '<', 'in.txt';
my %data;
while (<$in>)
chomp;
my @split = split(/\s+/);
next if exists $data$split[0];
$data$split[0] = [$split[1], $split[2], $split[3] ];
print Dumper \%data;
【讨论】:
请考虑在您的答案中添加对代码的解释。【参考方案3】:或者,像 @mpapec 的解决方案,但作为匿名哈希 (%_
):
perl -ane '$$F[0]++ or print' file.txt
虽然那时我真的只是在打愚蠢的代码高尔夫......
【讨论】:
其实不是匿名哈希,而是操纵main::
包变量的符号引用。 eval.in/165835
哎呀。所以这里的“默认哈希”%_
是 %main::
吗?那是坏/慢/愚蠢吗? :-D 我假设因为它是使用 -ane
运行的,所以它会以某种方式在隐含的
内。无论如何很高兴知道,谢谢。
-n
隐含while(<>)
,-a
将行拆分为@F
。检查Symbolic references of scalar variables
部分perlmaven.com/symbolic-reference-in-perl以上是关于如何使用 Perl 将文件中第一次出现的行放入 %hash 中?的主要内容,如果未能解决你的问题,请参考以下文章