在Perl中的散列表中解析文本文件和存储字段

时间:2013-06-18 04:21:11

标签: perl file parsing hashtable

我的perl脚本存在问题,该脚本读取文本文件并存储由制表符分隔的第一个字段。

这是一个例子: texte输入文件:

@ ries bibliothèques électroniques à travers tout le    1   0.000012706627117
a a pour les ressortissants des nouveaux états  1   0.000006796917515
a abandonné dès l abord avec dilettantisme l    1   0.000009584625169
a abandonné la culture du lin à fibres  1   0.000009718010335
a abandonné le secteur de la pêche aux  1   0.000006983488644

因此脚本必须存储每行的第一个字段并将它们存储在哈希表中:'@riesbibliothèquesélectroniquesàtraverstout le','aa pour les ressortissants desnouveauxétats','aabandonnédèslabord avec dilettantisme','aabandonnélaculture dulinàfiber','aabandonnélesecteur delapêcheaux'。

这是脚本:

#!/usr/bin/perl -w

# use strict;

my %hash = ();

open (my $fh,"<", "tst") or die "Can't open the file: ";

while (my $line =<$fh>){

chomp ($line);

my ($key)=split("\t", $line);

my $val;

$hash{$key} =$val;

}

print "\n";

while ( my ($key, $val) = each(%hash) ) {

print "$key => $val\n";

  }

问题是这个脚本不起作用:(请知道吗?

1 个答案:

答案 0 :(得分:1)

这种简单(适度简单)的代码改编:

#!/usr/bin/perl -w
use strict;

my %hash = ();
my $file = "tst";

open (my $fh, "<", $file) or die "Can't open the file $file: ";

while (my $line =<$fh>)
{
    chomp ($line);
    my($key, $count, $number) = split("\t", $line);
    $hash{$key} = [ $count, $number ];
}

while (my($key, $val) = each(%hash))
{
    print "$key => @{$val}\n";
}

给出输入文件:

@ ries bibliothèques électroniques à travers tout le       1       0.000012706627117
a a pour les ressortissants des nouveaux états    1       0.000006796917515
a abandonné dès l abord avec dilettantisme l      1       0.000009584625169
a abandonné la culture du lin à fibres    1       0.000009718010335
a abandonné le secteur de la pêche aux    1       0.000006983488644

(其中多个空格表示文件中的选项卡,给出输出:

a a pour les ressortissants des nouveaux états => 1 0.000006796917515
@ ries bibliothèques électroniques à travers tout le => 1 0.000012706627117
a abandonné la culture du lin à fibres => 1 0.000009718010335
a abandonné dès l abord avec dilettantisme l => 1 0.000009584625169
a abandonné le secteur de la pêche aux => 1 0.000006983488644

如果那不是您所追求的,也许您需要指定每个键应存储的值。

my($key, $count, $number)部分将每行三个字段保存到命名变量中。这一行:

$hash{$key} = [ $count, $number ];

创建一个散列条目,其中包含存储数组引用的字符串$key,其中数组包含两个值$count$number。行

print "$key => @{$val}\n";

打印$val引用的数组。


要求仍然不明确,但显然,只需要存储密钥。目前尚不清楚将其存储在数组中是否足够,或者是否必须将其存储在散列中。

阵列

#!/usr/bin/perl -w
use strict;

my @array = ();
my $file = "tst";

open (my $fh, "<", $file) or die "Can't open the file $file: ";

while (my $line =<$fh>)
{
    chomp ($line);
    my($key) = split("\t", $line);
    push @array, $key;
}

foreach my $key (@array)
{
    print "$key\n";
}

哈希

#!/usr/bin/perl -w
use strict;

my %hash = ();
my $file = "tst";

open (my $fh, "<", $file) or die "Can't open the file $file: ";

while (my $line =<$fh>)
{
    chomp ($line);
    my($key) = split("\t", $line);
    $hash{$key} = 1;
}

foreach my $key (sort keys %hash)
{
    print "$key\n";
}