Perl:使用 Text::CSV 我可以写出哈希引用吗?

标签 perl csv cpan text-processing

我有一个 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/

相关文章:

regex - 将文本文件中的匹配行组合在一起

csv - BigQuery 从 bq 命令行工具加载数据 - 如何跳过标题行

php - 从 CSV 文件中删除行

perl - 如何使 inc::module::install 建议 ubuntu 包?我是不是该?

perl - 使用 mason 模板执行 perl 脚本

perl - 寻求避免 "action at a distance"的模式

python - 如何快速匹配两个已排序文件的字段,但一个是另一个文件的子集

perl - 反转智能匹配运算符的操作数不会给出相同的结果

linux - Arin 批量 whois 数据 perl 无法在 @INC 中找到 BulkWhois/Schema.pm

mysql - CSV导入Mysql数据未添加到表中