如何使用前两列作为键将文本文件读入 Perl 哈希



我正在尝试将包含此内容的文件读取到 Perl 哈希中。

我希望前两列是键,其余列是值。

Celena Standard  F 01/24/94 Cancer 
Jeniffer Orlowski  F 06/24/86 None
Brent Koehler  M 12/05/97  HIV
Mao Schleich  M 04/17/60  Cancer
Goldie Moultrie  F 04/05/96  None

这就是我卡住的地方。

open FILE1, "Patient_Info.txt" or die;
my %hash;
while ( my $line = <FILE1> ) {
    chomp $line;    # remove newline
    my ( $key, $value ) = split ' ', $line, 2;
    $hash{$key} = $value;
}
my @sorted_keys = sort keys %hash;
my $new         = 'Celena';
for my $new ( @sorted_keys ) {
    print "$new $hash{$new} n";
}

前两个字段在 '' 上连接,其余字段保留为数组引用:

use strict;
use warnings;
my %data;
while (<DATA>) {
    my @fields = split;
    my $key = join('', splice(@fields, 0, 2));
    $data{$key} = @fields;
}
for my $key (sort(keys(%data))) {
    printf("%s: %sn", $key, join(' ', @{$data{$key}}));
}
__DATA__
Celena Standard F 01/24/94 Cancer
Jeniffer Orlowski F 06/24/86 None
Brent Koehler M 12/05/97 HIV
Mao Schleich M 04/17/60 Cancer
Goldie Moultrie F 04/05/96 None

输出:

BrentKoehler: M 12/05/97 HIV
CelenaStandard: F 01/24/94 Cancer
GoldieMoultrie: F 04/05/96 None
JenifferOrlowski: F 06/24/86 None
MaoSchleich: M 04/17/60 Cancer

关于代码的一些注释

你应该

  • 始终 use strictuse warnings 'all'在你编写的每个Perl程序的顶部

  • 使用词法文件句柄,例如my $file1而不是FILE1,因为它们比全局句柄更安全、更有用

  • 请选择更好的变量标识符。在%hash中,%说它是一个哈希,所以你不妨使用%_。这也许是一份人员名单吗?还是订阅者列表?

我无法弄清楚您希望my $new = 'Celina'什么,因为您再也不会使用该变量

没有说你希望如何将数据存储在哈希中,所以我使用了一个数组来存储最后三个字段

我添加了Data::Dump输出,以便您可以看到结果哈希的结构,以及一个简单的while循环,用于重现原始数据(以不同的顺序(

use strict;
use warnings 'all';
use autodie;
my %data = do {
    open my $fh, '<', 'patient_info.txt';
    map {
        my ($first, $second, @info) = split;
        "$first $second" => @info;
    } <$fh>;
};
use Data::Dump;
dd %data;
print "n";
while ( my ($name, $info) = each %data ) {
    print "$name @$infon";
}

输出

{
  "Brent Koehler"     => ["M", "12/05/97", "HIV"],
  "Celena Standard"   => ["F", "01/24/94", "Cancer"],
  "Goldie Moultrie"   => ["F", "04/05/96", "None"],
  "Jeniffer Orlowski" => ["F", "06/24/86", "None"],
  "Mao Schleich"      => ["M", "04/17/60", "Cancer"],
}
Celena Standard F 01/24/94 Cancer
Mao Schleich M 04/17/60 Cancer
Jeniffer Orlowski F 06/24/86 None
Goldie Moultrie F 04/05/96 None
Brent Koehler M 12/05/97 HIV

最新更新