3

配列の要素がタブで区切られた値を持つ配列があります。例えば:

クライアント名 \t 所有者 \t 日付 \t ポート番号.

これをハッシュに変換して、MySQL データベースにダンプできるようにする必要があります。何かのようなもの:

my %foo = ();
$foo{date} = "111208";
$foo{port} = "2222";
$foo{owner} = "ownername";
$foo{name} = "clientname";   

私が抱えている問題は、クライアント名が重複しているが、それらが異なるポート番号に存在することです。client_name をキーとして直接ハッシュに変換すると、重複するクライアント名が削除されます。MySQL テーブルは、{name} と {port} に基づいてインデックスが作成されます。

重複したクライアント名を失うことなく、これをハッシュに変換する方法はありますか?

4

3 に答える 3

4

ファイルを調べて、行ったようにハッシュを構築し、そのハッシュへの参照を配列にプッシュします。何かのようなもの:

foreach my $line ( @lines ) {
  # Make your %foo hash.
  push @clients, \%foo;
}

その後、DB に挿入するときに、次の要素を繰り返し処理します@clients

foreach my $client ( @clients ) {
  $date = $client->{'date'};
  ...
}

編集:これをハッシュのハッシュに変換したい場合は、行のリストをループするときに、次のようにします。

foreach my $line ( @lines ) {
  # Make your %foo hash.
  $clients{$foo{'port'}} = \%foo;
}

次に、ポート番号をキーとして使用してハッシュのハッシュを取得します。

于 2011-12-08T17:52:59.003 に答える
1

リスト(配列)に保存するだけではどうですか?

my @records = ();
while (my $line = <INFILE>) {
  chomp $line;
  my @fields = split /\t/ $line;
  push @records => { date => $fields[2],
                     name => $fields[0],
                     port => $fields[3],
                     owner => $fields[1] };
}
for my $record (@records) {
   $insert_query->execute (%$record);
}
于 2011-12-08T17:54:49.490 に答える
0
my @record_list;
while ( <$generic_input> ) { 
     my $foo = {};
     @$foo{ qw<date port owner name> } = split /\t/;
     push @record_list, \%foo;
 }

「パイプライン」として、これを行うことができます:

use List::MoreUtils qw<pairwise>;
my @fields = qw<date port owner name>;
my @records 
    = map {; { pairwise { $a => $b } @fields, @{[ split /\t/ ]}}}
      <$input>
    ;
于 2011-12-08T20:17:57.613 に答える