我正在编写我的第一个Perl脚本,并且逐行读取一个小文本文件。字段由':'分隔,所以我想使用第一个字段(名称)作为每个字符的键将每个字段拆分为哈希数组。此外,(我认为)我想要一个包含所有信息的大哈希,或者只是一个包含每个字段的数组,这样我就可以根据模式在一行上打印所有信息。我没有远,因为%info
在哈希赋值中创建奇数#元素。我应该把它作为常规阵列,我是否正确地采用这种方式?基本上,线条按此顺序排列。
name:phone:address:date:salary
#!/usr/bin/perl -w
use strict;
print $#ARGV;
if($#ARGV == -1)
{
print "Script needs 1 argument please.\n";
exit 1;
}
my $inFILE = $ARGV[0];
#open the file passed
open(IN, "$inFILE") || die "Cannot open: $!"; #open databook.txt
my %info = (my %name, my %phone, my %address, my %date, my %salary);
while(<IN>)
{
%info = (split /:/)[1];
}
close($inFILE);
答案 0 :(得分:4)
首先,您应该根据使用解析信息的方式定义数据结构。如果您使用名称作为索引来搜索信息,我建议使用嵌套的哈希,使用名称索引:
{name => {phone => ..., address => ..., date => ..., salary => ...}, ...}
如果您不打算使用name作为索引,只需将信息存储在数组中:
[ {name => ..., address => ..., date => ..., salary => ...},
{name => ..., address => ..., date => ..., salary => ...}, ...]
在大多数情况下,我会使用第一个。
其次,Perl中的数组和散列是平的。所以这个:
my %info = (my %name, my %phone, my %address, my %date, my %salary);
没有意义。使用ref来存储数据。
最后但并非最不重要的是,Perl对输入文件有一个语法糖。使用<>
从参数中读取文件,而不是显式打开文件。这使程序更“Perlish”。
use strict;
use warnings;
use Data::Dumper;
my $info = {};
while (<>) {
chomp;
my @items = split /:/, $_;
$info->{$items[0]} = { phone => $items[1],
address => $items[2],
date => $items[3],
salary => $items[4] };
}
print Dumper $info;