我有一个数组,其中数组的元素具有由制表符分隔的值。 例如:
client_name \ t owner \ t date \ t port_number。
我需要将其转换为哈希值,以便将其转储到MySQL数据库中。 类似的东西:
my %foo = ();
$foo{date} = "111208";
$foo{port} = "2222";
$foo{owner} = "ownername";
$foo{name} = "clientname";
我遇到的问题是有重复的客户端名称,但它们存在于不同的端口号上。如果我使用client_name作为密钥将其直接转换为哈希,它将删除重复的客户端名称。 MySQL表基于{name}和{port}索引。
有没有办法可以将其转换为哈希而不会丢失重复的客户名称?
答案 0 :(得分: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;
}
然后你将使用端口号作为密钥来散列哈希值。
答案 1 :(得分: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);
}
答案 2 :(得分: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>
;