Проблемы с преобразованием массива в хэш - PullRequest
3 голосов
/ 08 декабря 2011

У меня есть массив, в котором элементы массива имеют значения, разделенные вкладками. Например:

имя_клиента \ t владелец \ t дата \ t номер_порта.

Мне нужно преобразовать это в хеш, чтобы его можно было сбросить в базу данных MySQL. Что-то вроде:

my %foo = ();
$foo{date} = "111208";
$foo{port} = "2222";
$foo{owner} = "ownername";
$foo{name} = "clientname";   

У меня проблема в том, что есть дубликаты имен клиентов, но они существуют на разных номерах портов. Если я преобразую его непосредственно в хеш, используя client_name в качестве ключа, он удалит дублирующиеся имена клиентов. Таблица MySQL индексируется на основе {name} и {port}.

Можно ли как-нибудь преобразовать это в хеш, не теряя дубликаты имен клиентов?

Ответы [ 3 ]

4 голосов
/ 08 декабря 2011

Вы должны просмотреть свой файл, создать хеш, как вы сделали, а затем вставить ссылку на этот хеш в массив.Что-то вроде:

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 голос
/ 08 декабря 2011

Почему бы просто не сохранить его в списке (массиве)?

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 голосов
/ 09 декабря 2011
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>
    ;
...