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

发布于 2024-10-01 13:29:57 字数 614 浏览 3 评论 0原文

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

感谢 @harleypig 对我的上一个问题的评论,我' d 喜欢使用:

$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 对象写出哈希引用?

I have a Perl script that reads in a CSV file, changes the columns names of the original, adds new ones (output CSV column names are stored in the array, header_line), adds new field values for each row read, and then writes out a new CSV file.

Thanks to a comment by @harleypig on my last question, I'd like to use:

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

because this lets me easily access row fields using meaningful names rather than magic numbers. For example:

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

The only problem now is, what's the best way to write out the line? Previously, I used:

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

But that fails because it expects an array ref. How do I write out the hash ref using the csv_o object?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

屌丝范 2024-10-08 13:29:57

使用 哈希切片

$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%    --

Use a hash slice:

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

The map version works too, but the slice is faster:

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 ];
  },
});

gives me:

          Rate   map slice
map   282855/s    --  -42%
slice 487898/s   72%    --
挽清梦 2024-10-08 13:29:57

快速浏览一下文档,我认为您不容易做到。您必须将 hashref 转回(按列排序)数组,如下所示:

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

From a quick look at the docs, I don't think you can easily. You'd have to turn the hashref back into the (column-ordered) array, something like:

$csv_o->print( $fh_o, [ map { $row->{$_} } @header_line ] ); 
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文