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になります。 ありがとうございました:-)
...
そして印刷:: 'プリント(ダンパ(
私は、コードは次のようになりかもしれないと思います\%のdauerauftraege)) ' – toolic
https://gist.github.com/anonymous/8750158b1d3a7f5d840b35c24bd4c16a 申し訳ありませんが、あまりにも長い間ここに、この小さな箱:) ための出力しかし、それは同じように私には見えますが、私は中の上postetました私の質問。 – C3D1
'foreach my $ dauerauftrag_values(@dauerauftrag)'と 'print(%{$ dauerauftra_values} {'date_time'});'変数の名前は同じではありません!!!! '$ dauerauftrag_values'ではない' $ dauerauftra_values' – Mike