用于基本Perl脚本的哈希数组

时间:2013-11-06 06:14:45

标签: perl

我正在编写我的第一个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);

1 个答案:

答案 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;