我正在尝试将包含此内容的文件读取到 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 strict
并use 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