2011-12-08 9 views
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

あなたはあなたのファイルを通り、やったようにハッシュを構築し、そのハッシュへの参照を配列にプッシュします。ような何か:

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

、あなたのDBに挿入しているとき、あなただけの@clients内の要素を反復処理:

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

編集:あなたにこれをオンにする場合あなたは、Tを使用してハッシュのハッシュを持っていますそして、

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

:のようにハッシュのハッシュは、その後、行のリストを通して、あなたループとして、あなたが何かをしたいです彼はキーとしてポート番号を使用します。

+0

私は、データベースに挿入するためにハッシュを使用してモジュールを持っているので、私はハッシュとして、それを維持したいです。 1つは、ポート番号をキーとして使用するハッシュのハッシュを作成することでした。 – cottageDog

+0

@cottageDog:私の編集を参照してください。 – CanSpice

+0

@cottageDog:データをハッシュに入れる無限の方法がありますが、すべてがあなたのモジュールがハッシュを要求するフォームに依存します。このモジュールは私たちが読むことができる公開されたものですか?または、それを使用したデータベース挿入の例を教えてください。 – Borodin

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); 
} 
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> 
    ; 
関連する問題