访问用于列规范的 "pair hash" 个引用
accessing "pair hash" references used for column specification
我正在构建一个小型库,用于将日志数据转换为 CSV-like 可以通过电子表格软件导入的文件。对于输出,如果需要,我对显示 table 列的 human-friendly 标题的选项感兴趣。这应该是一个选项,以便该工具也可以轻松使用。我想出了一个用于列规范的数组,其中包含键的纯标量或具有一对键和值的散列引用。我通过对我来说有点奇怪的键和值访问这些。
是否有更简单的方法来访问仅包含一对的散列的键和值?
(我尽量简化了代码。)
#!/usr/bin/perl -w
use strict;
use warnings;
# some sample data
my @rows = (
{x => 1, y => 2},
{y => 5, z => 6},
{x => 7, z => 9},
);
sub print_table {
my @columns = @_; # columns of interest with optional header replacement
my @keys; # for accessing the data values
my @captions; # for display on column headers
for (@columns) {
if (ref($_) eq 'HASH') {
push @keys, keys %$_;
push @captions, values %$_;
} else {
push @keys, $_;
push @captions, $_;
}
}
print join ("\t", @captions), "\n";
for my $row (@rows) {
print join ("\t", (map {$row->{$_} // ''} @keys)), "\n";
}
}
print_table({x=>'u'}, 'y');
使用each
.
来自perldoc:
When called on a hash in list context, returns a 2-element list
consisting of the key and value for the next element of a hash.
但不要忘记在之后使用 keys(%hash)
重置迭代器,否则后续 each
将失败。
my ($k, $v) = each(%$_);
keys(%$_);
所有你需要的:
my ($k, $v) = %hash;
所以
my ($k, $v) = %$_;
push @keys, $k;
push @captions, $v;
或
push @keys, ( %$_ )[0];
push @captions, ( %$_ )[1];
我正在构建一个小型库,用于将日志数据转换为 CSV-like 可以通过电子表格软件导入的文件。对于输出,如果需要,我对显示 table 列的 human-friendly 标题的选项感兴趣。这应该是一个选项,以便该工具也可以轻松使用。我想出了一个用于列规范的数组,其中包含键的纯标量或具有一对键和值的散列引用。我通过对我来说有点奇怪的键和值访问这些。
是否有更简单的方法来访问仅包含一对的散列的键和值?
(我尽量简化了代码。)
#!/usr/bin/perl -w
use strict;
use warnings;
# some sample data
my @rows = (
{x => 1, y => 2},
{y => 5, z => 6},
{x => 7, z => 9},
);
sub print_table {
my @columns = @_; # columns of interest with optional header replacement
my @keys; # for accessing the data values
my @captions; # for display on column headers
for (@columns) {
if (ref($_) eq 'HASH') {
push @keys, keys %$_;
push @captions, values %$_;
} else {
push @keys, $_;
push @captions, $_;
}
}
print join ("\t", @captions), "\n";
for my $row (@rows) {
print join ("\t", (map {$row->{$_} // ''} @keys)), "\n";
}
}
print_table({x=>'u'}, 'y');
使用each
.
来自perldoc:
When called on a hash in list context, returns a 2-element list consisting of the key and value for the next element of a hash.
但不要忘记在之后使用 keys(%hash)
重置迭代器,否则后续 each
将失败。
my ($k, $v) = each(%$_);
keys(%$_);
所有你需要的:
my ($k, $v) = %hash;
所以
my ($k, $v) = %$_;
push @keys, $k;
push @captions, $v;
或
push @keys, ( %$_ )[0];
push @captions, ( %$_ )[1];