2011-12-08 72 views
3

我有一個數組的元素,其中的元素具有由製表符分隔的值。 例如:將數組轉換爲散列時遇到問題

client_name \ 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; 
} 

然後事後,當你插入到你的數據庫,你只要通過元素@clients迭代:

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

編輯:如果你想變成一個散列哈希,然後當你循環行列表,你會做這樣的事情:

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

然後,你會有散列哈希使用t他以港口號碼爲關鍵。

+0

我有一個使用散列插入到數據庫中的一個模塊,所以我想保持它作爲一個哈希值。我想過的一個想法是創建一個使用端口號作爲密鑰的哈希散列。 – 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> 
    ;