2016-09-01 11 views
2

perlに新しい(昨日開始)。 ハッシュの配列に問題があります。Perlの配列からハッシュを読む

状況: ロギングアプリケーションからいくつかのCSVファイルがあります。ログファイルは毎日作成され、実際には構造が悪いです。私はそれらをグループ化していくつかの統計を示したいと思います。 csvの読み取りと解析は実際問題ではありませんが、簡単なアクセスのためにハッシュ内に列を格納したいと考えています。 csvファイル内のセカンダリ列(PhysName)は、データをグループ化する列です。だから私は、他の列だけをハッシュの中に保存し、これらのハッシュのいくつかを配列の中に保存し、他のハッシュの中に配列を保存することをお勧めします。ダンパは私が表示されていること、

$VAR1 = 'YYYYYYYXXXXXXXX'; 
$VAR2 = [ 
      { 
      'transport' => 'FTP', 
      'format' => 'V1', 
      'partnername' => 'A_TEST', 
      'date_time' => '2016.07.25 11:16:52', 
      'sender' => 'BBB', 
      'recipient' => 'CCC' 
      }, 
      { 
      'recipient' => 'CCC', 
      'sender' => 'BBB', 
      'partnername' => 'A_TEST', 
      'date_time' => '2016.07.25 11:17:15', 
      'format' => 'V1', 
      'transport' => 'FTP' 
      } 
     ]; 
$VAR3 = 'XXXXXXXYYYYYYYY'; 
$VAR4 = [ 
      { 
      'format' => 'V2', 
      'partnername' => 'S_TEST', 
      'date_time' => '2016.07.25 10:15:02', 
      'recipient' => 'DDD', 
      'sender' => 'AAA', 
      'transport' => 'HTTP' 
      }, 
      { 
      'transport' => 'HTTP', 
      'recipient' => 'DDD', 
      'sender' => 'AAA', 
      'partnername' => 'S_TEST', 
      'format' => 'V2', 
      'date_time' => '2016.07.25 10:15:30' 
      } 
     ]; 

私の最初の考えはだった:私は、次の取得print(Dumper(%dauerauftraege))でこれを確認してみてください

my %dauerauftraege; 

# Glob all CSV-Files in folder 
my @files = glob("*.csv"); 

foreach my $file(@files) { 
    # read the file 
    open(DATA, "<$file") or die("Could not open File"); 

    LINE: 
    foreach my $line(<DATA>) { 
     chomp($line); 
     if ($line eq "") { 
      next LINE; 
     } 

     # Split Line into Fields 
     my @line_data = split(";", $line); 

     my $phys_name = $line_data[1]; 

     # skip the header file 
     if ($phys_name eq "PhysName") { 
      next LINE; 
     } 

     my %values =(
     'date_time' => $line_data[0], 
     'sender' => $line_data[2], 
     'recipient' => $line_data[3], 
     'format' => $line_data[4], 
     'transport' => $line_data[5], 
     'partnername' => $line_data[6]); 

     push(\@{$dauerauftraege{"$phys_name"}}, \%values); 
    } 
} 

:全然大したことではなかった

奇数の$ VARをキーとし、偶数$ VARをValuesとして扱いますが、偶数$ VAR内のハッシュを詳しく見てから、内側のハッシュを挿入する間に何か間違ったことをしていますおよび値)を配列に格納し、%dauerauftraegeハッシュに格納します。私はいつもこのエラーが出る

だから、今、それはハッシュからの読み取りになると、ここにこのコードのハッシュの配列を含む

# Get the keys to iterate over them 
my @dauerauftraege_keys = keys(%dauerauftraege); 
print("count dauerauftraege: ".(scalar @dauerauftraege_keys)."\n"); 
# iterate over the keys to get the array of hashes 
foreach my $dauerauftrag_key (@dauerauftraege_keys) { 
    # retrive the array 
    my @dauerauftrag = $dauerauftraege{"$dauerauftrag_key"}; 
    print("count hashes inside the array: ".(scalar @dauerauftrag)."\n"); 
    # iterate over the hashes and print the values 
    foreach my $dauerauftrag_values (@dauerauftrag) { 
     print(%{$dauerauftra_values}{'date_time'}); 
     print("\n"); 
     print(%{$dauerauftra_values}{'sender'}); 
     print("\n"); 
     print(%{$dauerauftra_values}{'recipient'}); 
     print("\n"); 
     print(%{$dauerauftra_values}{'format'}); 
     print("\n"); 
     print(%{$dauerauftra_values}{'transport'}); 
     print("\n"); 
     print(%{$dauerauftra_values}{'partnername'}); 
     print("\n"); 
    } 
} 

count dauerauftraege: 2 
count hashes inside the array: 1 
Use of uninitialized value in print at ./LastRun_Evaluation.pl line 56, <DATA> line 5. 
Use of uninitialized value in print at ./LastRun_Evaluation.pl line 57, <DATA> line 5. 
Use of uninitialized value in print at ./LastRun_Evaluation.pl line 58, <DATA> line 5. 
Use of uninitialized value in print at ./LastRun_Evaluation.pl line 59, <DATA> line 5. 
Use of uninitialized value in print at ./LastRun_Evaluation.pl line 60, <DATA> line 5. 
Use of uninitialized value in print at ./LastRun_Evaluation.pl line 61, <DATA> line 5. 
date_timesenderrecipientformattransportpartnernamecount hashes inside the array: 1 
Use of uninitialized value in print at ./LastRun_Evaluation.pl line 56, <DATA> line 5. 
Use of uninitialized value in print at ./LastRun_Evaluation.pl line 57, <DATA> line 5. 
Use of uninitialized value in print at ./LastRun_Evaluation.pl line 58, <DATA> line 5. 
Use of uninitialized value in print at ./LastRun_Evaluation.pl line 59, <DATA> line 5. 
Use of uninitialized value in print at ./LastRun_Evaluation.pl line 60, <DATA> line 5. 
Use of uninitialized value in print at ./LastRun_Evaluation.pl line 61, <DATA> line 5. 
date_timesenderrecipientformattransportpartnername 

私は信じます、私の問題は、followinigラインであること:

push(\@{$dauerauftraege{"$phys_name"}}, \%values); 

私は慎重にこの行を読んだとき、私は目を理解します次のようになります。 $dauerauftraege{"$phys_name"}は、配列への参照を含むskalar($)を返します。配列には、@{}によって参照解除されます。 そして\%valuesで、valuesハッシュへの参照をpush Funktionに渡します。これは、配列の参照に追加します。これは、@の前に\と表示されます。

誰でもこの問題で私を助けることができたら、私はverry happyになります。 ありがとうございました:-)

+0

...

use strict; use warnings; my %dauerauftraege; # Glob all CSV-Files in folder my @files = glob("*.csv"); foreach my $file(@files) { # read the file open(my $fh, "<", $file) or die("Could not open File"); LINE: foreach my $line(<$fh>) { chomp($line); next LINE unless($line); # Split Line into Fields my @line_data = split(";", $line); my $phys_name = $line_data[1]; # skip the header file next LINE if ($phys_name eq "PhysName"); @{$dauerauftraege{"$phys_name"}} {'date_time', 'sender', 'recipient', 'format', 'transport', 'partnername'}[email protected]_data[0,2..6]; } } 

そして印刷:: 'プリント(ダンパ(

私は、コードは次のようになりかもしれないと思います\%のdauerauftraege)) ' – toolic

+0

https://gist.github.com/anonymous/8750158b1d3a7f5d840b35c24bd4c16a 申し訳ありませんが、あまりにも長い間ここに、この小さな箱:) ための出力しかし、それは同じように私には見えますが、私は中の上postetました私の質問。 – C3D1

+1

'foreach my $ dauerauftrag_values(@dauerauftrag)'と 'print(%{$ dauerauftra_values} {'date_time'});'変数の名前は同じではありません!!!! '$ dauerauftrag_values'ではない' $ dauerauftra_values' – Mike

答えて

1

を参照してください。 。これを試してみてください:

my @dauerauftraege_keys = keys %dauerauftraege; 
print("count dauerauftraege: ".(scalar @dauerauftraege_keys)."\n"); 
# iterate over the keys to get the array of hashes 
foreach my $dauerauftrag_key (@dauerauftraege_keys) { 
    # retrieve the array 
    my $dauerauftrag = $dauerauftraege{"$dauerauftrag_key"}; # ref to array 
    my @a = @$dauerauftrag; 
    print("count hashes inside the array: ".(scalar @a)."\n"); 
    # iterate over the hashes and print the values 
    foreach my $dauerauftrag_values (@a) { # also a reference 
     print $dauerauftrag_values->{'date_time'} . "\n"; 
     print $dauerauftrag_values->{'sender'} . "\n"; 
     print $dauerauftrag_values->{'recipient'} . "\n"; 
     print $dauerauftrag_values->{'format'} . "\n"; 
     print $dauerauftrag_values->{'transport'} . "\n"; 
     print $dauerauftrag_values->{'partnername'} . "\n"; 
    } 
} 
+0

これは本当に魅力のように私のために働く。ありがとうございましたあなたのコードに、私は今、どこで私は間違いをした参照してください。あなたにタンク! :-) – C3D1

1

データ構造の逆参照方法がわかりません。私は物事が少し明確にするだろう期待してビットを変更した以下のコードを見て:

my @keys = keys(%dauerauftraege); 

for my $key (@keys) { 

    print "*** $key ***\n"; 

    my $aref = $dauerauftraege{$key}; 

    for my $values_href (@$aref){ 
     print "$values_href->{date_time}\n"; 
     print "$values_href->{sender}\n"; 
     print "$values_href->{recipient}\n"; 
     print "$values_href->{format}\n"; 
     print "$values_href->{transport}\n"; 
     print "$values_href->{partnername}\n"; 
    } 
    print "\n"; 
} 

は、私は、問題はあなたのデータ構造にアクセスする方法だと思いますperldsc

+0

はい、そうです。逆参照についていくつか問題があります。 – C3D1

1

は常にプラグマuse strict;use warnings;を使用しています。彼らはタイプミスやその他の問題を避けるのに役立ちます。

%dauerauftraegeはハッシュですが、配列のようにアクセスしようとしました。そして、あなたはハッシュを通してループを作ろうとしており、同時に、ハッシュ全体の各反復で印刷するようにしています。その後、代わりにその出力を投稿し、ダンパへのハッシュリファレンスを渡し

# Get the keys to iterate over them 
my @dauerauftraege_keys = keys(%dauerauftraege); 
print("count dauerauftraege: ".(scalar @dauerauftraege_keys)."\n"); 
# iterate over the keys to get the array of hashes 
foreach my $dauerauftrag_key (@dauerauftraege_keys) { 
    print "\n$dauerauftrag_key:\n"; 
    print join("\n", 
      @{$dauerauftraege{"$dauerauftrag_key"}}{'date_time','sender','recipient', 
          'format','transport','partnername'})."\n"; 
} 
+1

字句ファイルを処理してください。 – simbabque

+0

ありがとうございました。 +1、私はあなたがPerlで "one-line-ifs"をどのようにしたかを好きです。このように、コードは神を探しています:-) +1は 'use strict;'と 'use warnings;'のヒントのために+1します! :) – C3D1

関連する問題