Perl: С помощью Text :: CSV я могу написать хеш-ссылку? - PullRequest
1 голос
/ 12 ноября 2010

У меня есть скрипт Perl, который читает файл CSV, изменяет имена столбцов оригинала, добавляет новые (выходные имена столбцов CSV хранятся в массиве header_line), добавляет новые значения полей для каждой прочитанной строки и затем записывает новый файл CSV.

Благодаря комментарию @harleypig к моему последнему вопросу я бы хотел использовать:

$csv_i->column_names( @header_line);
$row = $csv_i->getline_hr($fh_i)

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

$row->{ 'name' } = get_fullname($row->{ 'name' });

Единственная проблема сейчас в том, как лучше написать строку? Ранее я использовал:

$csv_o->print( $fh_o, $row ); 

Но это не удалось, потому что он ожидает массив ref. Как выписать хэш-ссылку, используя объект csv_o?

Ответы [ 2 ]

4 голосов
/ 12 ноября 2010

Использовать фрагмент хеша :

$csv_o->print( $fh_o, [ @$row{@header_line} ] );

Версия map тоже работает, но срез быстрее:

use Benchmark 'cmpthese';

my @header_line = qw(a b c d e f g);
my $row = { map { $_ => $_ } @header_line };

my $array;

cmpthese(-3, {
  slice => sub {
    $array = [ @$row{@header_line} ];
  },

 map => sub {
    $array = [ map { $row->{$_} } @header_line ];
  },
});

дает мне:

          Rate   map slice
map   282855/s    --  -42%
slice 487898/s   72%    --
1 голос
/ 12 ноября 2010

Беглый взгляд на документы, я не думаю, что вы можете легко. Вы должны превратить хэш-ссылку обратно в (упорядоченный по столбцу) массив, что-то вроде:

$csv_o->print( $fh_o, [ map { $row->{$_} } @header_line ] ); 
...