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

然后,当您插入数据库时​​,您只需遍历以下元素@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 回答