1

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

1 回答 1

4

首先,您应该根据如何使用解析的信息来定义数据结构。如果您使用名称作为索引来搜索信息,我建议使用嵌套哈希,按名称索引:

{name => {phone => ..., address => ..., date => ..., salary => ...}, ...}

如果您不打算使用名称作为索引,只需将信息存储在一个数组中:

[ {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;
于 2013-11-06T06:35:47.070 回答