如何使用 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(&lt;&gt;)-a 将行拆分为@F。检查Symbolic references of scalar variables 部分perlmaven.com/symbolic-reference-in-perl

以上是关于如何使用 Perl 将文件中第一次出现的行放入 %hash 中?的主要内容,如果未能解决你的问题,请参考以下文章

Perl单行(Perl One-Liners)命令

如何使用 Perl 处理大数据文件?

Perl - 如何从文本文件中省略行?

使用 Perl 提取特定行

如何在 Perl 中只写文件的某些行?

如何在perl中删除哈希值中的重复值?