Perl:使用Text :: CSV可以写出散列引用吗?

时间:2010-11-12 09:09:50

标签: perl csv cpan text-processing

我有一个读取CSV文件的Perl脚本,更改原始列名,添加新名称(输出CSV列名存储在数组中,header_line),为每行读取添加新字段值,以及然后写出一个新的CSV文件。

感谢@harleypig对我上次question的评论,我想使用:

$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 ); 

但是失败了,因为它需要一个数组引用。如何使用csv_o对象写出散列引用?

2 个答案:

答案 0 :(得分:4)

使用hash slice

$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 :(得分:1)

从快速浏览文档,我认为你不能轻易。您必须将hashref转换回(按列排序)数组,如:

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