在Perl中初始化哈希数组

时间:2012-02-27 15:30:43

标签: arrays perl hash

我是Perl的新手,我正在写一个Perl脚本。我的脚本的一部分计算每个单词出现在文本文件中的次数。这个计数在特定区间之后重复,因此我需要每个重复序列的阵列。我有代码来计算单词的数量,但仅仅是一个顺序

for (@array) {
  $counts{$_}++;
  print "\'$_\'\t";
}

我的麻烦是我需要为哈希“计数”创建一个数组。

编辑:按照ARRAY我的意思是我应该能够为文本文件的每个特定部分存储每个单词的重复。我只需要确定文本文件中每个部分的部分计数。这就是我的文本文件:!

i HAVE uploaded an image to describe in details

3 个答案:

答案 0 :(得分:2)

关于Perl的好处是没有必要初始化哈希或数组,只需创建一个。

你说你是一个新的Perl用户,但你似乎知道引用。您可以在tutorial内阅读优秀的Perl documentation。您可以使用命令行中的perldoc命令执行此操作。

那就是说,看看你的应用程序,我可以看到几种不同类型的数据结构:

  • 哈希数组:在此结构中,您为每个要击中的部分都有一个数组,并且您将从0到最大命中的部分编号。您将每个条目的计数存储在该条目的哈希中。

代码看起来像这样:

my $section_number = -1;   #We'll increment this to one on the first section number
my @data;                  #This is an array where you'll store your sections

while (my $line = <$my_file>) {
   chomp $line;
   if ($line =~ /^>this is my \w+ statement$/) {
       $section_number++;
       $data[$section_number] = {};  #A reference to a hash
   }
   else {
      $data[$section_number]->{$line}++;
   }
}

if语句的第一部分只是递增节数,因此每个参数都存储在不同的节中。这很好,如果问题是在#x部分,您看到参数“y”多少次?

  • 数组哈希:这次,您要跟踪参数,然后是参数出现的部分。这与上述情况相反,但有助于回答问题每个部分中出现参数“y”多少次?

代码看起来像这样:

my $section_number = -1;   #We'll increment this to one on the first section number
my %data;                  #This is an array where you'll store your sections

while (my $line = <$my_file>) {
   chomp $line;
   if ($line =~ /^>this is my \w+ statement$/) {
       $section_number++;
   }
   else {
       if (not exists $data{$line}) {
            $data{$line} = [];    #This hash will contain a ref to an array
       }          
       $data{$line}->[$section_number]++;
   }
}

另一种可能性是使用TLP显示的散列哈希

关键是,当您谈论的结构不仅包含标量数据时,您需要使用引用。

您希望如何构建数据结构取决于您想要跟踪的内容以及您希望如何访问该数据。如这一个问题所示,至少有三种不同的方法可以构建数据。而且,构建这种复杂的数据结构相当容易。并且,没有什么可以初始化。

一旦你理解了引用,你的数据结构就会像你敢的那样复杂(虽然我建议你先开始研究面向对象的Perl编码技术,然后才真正使用它们。)

顺便说一下,除了使用Data::Dumper之外,没有一个答案提到你如何访问你的数据,但是一个简单的循环就足够了。这是一组哈希:

 my $section = 0;
 while ($section <= $#data) {
    my %param_hash = %{$data[$section]};
    foreach my $parameter (sort keys %param_hash) {
        print "In section $section: $parameter appears $param_hash{$parameter} times\n";
    }
    $section++;
}

答案 1 :(得分:1)

我不确定你在这里问的是什么,但是一个好的开始方法可能就是简单地将所有数据添加到哈希中,然后从该哈希中提取所需的数据。

use strict;
use warnings;
use Data::Dumper;

my %count;
my $section;
while (<DATA>) {
    chomp;
    if (/^section/) {      # some check to tell sections apart
        $section = $_;
    } else {
        $count{$section}{$_}++;
    }
}

print Dumper \%count;      # see what your structure looks like
my @array = values %count; # if you don't like hashes

__DATA__
section1
param1
param2
param2
param3
section2
param1
param2
param3
param1
section3
param4
param1
param1
param2
section4
param1
param3

答案 2 :(得分:0)

构建字数的匿名哈希。在每个部分的末尾将哈希推送到数组并启动一个新的匿名哈希。下面的代码实现了这个。 (对Data::Dumper的调用仅用于演示已构建的数据结构。)

use strict;
use warnings;

my $sect;
my @counts;

while (<DATA>) {
  if (/^(\w+)/) {
    $sect->{$1}++;
  }
  elsif ($sect) {
    push @counts, $sect;
    undef $sect;
  }
}

use Data::Dumper;
$Data::Dumper::Sortkeys = 1;
print Data::Dumper->Dump([\@counts], ['*counts']);


__DATA__
--------------------
>this is my first statement
Parameter1
Parameter2
Parameter3
Parameter2
--------------------
>this is my second statement
Parameter1
Parameter2
Parameter3
--------------------
>this is my third statement
Parameter1
Parameter2
Parameter2
Parameter3
--------------------
>this is my fourth statement
Parameter1
Parameter2
--------------------
>this is my fifth statement
Parameter1
Parameter2
Parameter3
Parameter4
--------------------

<强>输出

@counts = (
  {
    'Parameter1' => 1,
    'Parameter2' => 2,
    'Parameter3' => 1
  },
  {
    'Parameter1' => 1,
    'Parameter2' => 1,
    'Parameter3' => 1
  },
  {
    'Parameter1' => 1,
    'Parameter2' => 2,
    'Parameter3' => 1
  },
  {
    'Parameter1' => 1,
    'Parameter2' => 1
  },
  {
    'Parameter1' => 1,
    'Parameter2' => 1,
    'Parameter3' => 1,
    'Parameter4' => 1
  }
);