2012-02-27 11 views
0

私はPerlにはかなり新しく、Perlスクリプトを書いています。スクリプトの一部は、各単語がテキストファイルに現れる回数を数えます。このカウンティングは特定の間隔の後に繰り返され、です。そのため、私はその再配列のたびに配列が必要です。私は、単語の数を数えるコードを持っています。ただ1つのシーケンスです。Perlでハッシュの配列を初期化する

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

私の問題は、ハッシュ「カウント」の配列を作成する必要があることです。

編集:ARRAYでは、テキストファイルの特定のセクションごとに各単語の繰り返しを保存できるはずです。私は、テキストファイル内の各セクションの部分的な数値を決定する必要があります。これは私のテキストファイルのようです:

i HAVE uploaded an image to describe in details

+0

「ハッシュの値を1つ増やす方法はありますか」とはどういう意味ですか?ハッシュの各要素を1つずつ増やしたいとしますか? "ハッシュの配列を作成する"?あなたは配列にハッシュを入れたいですか? 'push @list、\%hash'? – Qtax

+1

マングリングの前後にサンプルデータを入力してください。 – daxim

+1

私はあなたがハッシュを持っていることを理解しています。あなたは配列を持っています。ハッシュにはカウントがありますが、配列にはありません。しかしその後、あなたは私を失った。あなたの問題を説明するのであれば、あなたの解決策(問題は解決しない)を問題に説明するのではなく、簡単に説明できます。 – TLP

答えて

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を示したことをハッシュハッシュを使用することです。

単なるスカラーデータ以外のものが含まれている構造については、参照を使用する必要があります。

データ構造をどのように構築するかは、実際にはあなた次第であり、追跡する内容とそのデータへのアクセス方法によって異なります。この1つの質問に示されているように、データを構造化する方法は少なくとも3つあります。そして、この複雑なデータ構造を構築することはかなり簡単です。そして、何も初期化するものはありません。

参考文献を理解したら、あなたのデータ構造はあまりにも複雑になる可能性があります。

ちなみに、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

私はあなたがここに求めているかを正確にわからないんだけど、開始するには良い方法は、単にハッシュにすべてのデータを追加し、そのハッシュから必要なデータを抽出するために、おそらくです。

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 
+0

お返事ありがとうございます。 – NumbersInMyHead

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 
-------------------- 

OUTPUT

@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 
    } 
); 
+0

お返事いただきありがとうございます。 – NumbersInMyHead