我有一个 Perl 脚本,它读取 CSV 文件,更改原始列名称,添加新列名称(输出 CSV 列名称存储在数组 header_line 中),为读取的每行添加新字段值,以及然后写出一个新的 CSV 文件。
感谢 @harleypig 对我的上一篇评论 question ,我想使用:
$csv_i->column_names( @header_line);
$row = $csv_i->getline_hr($fh_i)
因为这让我可以使用有意义的名称而不是魔数(Magic Number)轻松访问行字段。例如:
$row->{ 'name' } = get_fullname($row->{ 'name' });
现在唯一的问题是,写出该行的最佳方式是什么?以前,我使用过:
$csv_o->print( $fh_o, $row );
但是失败了,因为它需要一个数组引用。如何使用 csv_o 对象写出哈希引用?
最佳答案
使用 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% --
关于Perl:使用 Text::CSV 我可以写出哈希引用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4163048/