2011-12-08 76 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> 
    ;