我有一个文件存储由|
(管道标志)分隔的查询结果。我希望每个列都被哈希引用。
例如。 f.txt
文件包含是:
aaa|bbb|ccc
ddd|eee|fff
ggg|hhh|iii
我需要o / p为:
a{a}=> {aaa,ddd,ccc}
a{b}=> {bbb,eee,hhh}
a{c}=> {ccc,fff,iii}
请提供相同的建议。
答案 0 :(得分:1)
我认为您最好将数据表示为数组数组而不是哈希哈希。这是因为您不知道键是什么。数组是 有序列表 数据,您至少可以通过这种方式引用数据的特定行和列,而无需为其创建键。
如果您知道列的名称,则可能需要哈希数组。这样,您可以在数组中引用具有元素编号的特定行,但是通过名称引用该列。
这是使用数组数组:
use strict;
use warnings;
use autodie;
use feature qw(say);
use constant {
FILE_NAME => "...",
};
open my $fh, "<", FILE_NAME;
#
# This builds your Array of Arrays
#
my @file_contents;
while ( my $row = <$fh> ) {
chomp $row;
push @file_contents, split /\s*\|\s*/, $row;
}
#
# We count from 1, but arrays count from zero. That's why array indexes
# are one less than the row and column I am referring to.
#
say "The first row and second column is " . $file_contents[0]->[1];
say "The third row and third column is " . $file_contents[2]->[2];
#
# This reprints entire file with the separators
#
for my $row ( @file_contents ) {
@columns = @{ $row };
say join "|", @columns;
}
我也知道我的列和哈希键是什么。我需要将此o / p传递给内置API,该API仅将参数作为哈希。因此无法将数据存储在数组中。
你是说你的列是一个哈希,列名是哈希键吗?这是有道理的。如果你说每个ROW都有自己的键,你必须让我知道它是什么,它来自何处。
这是一个在名为@file_contents
的数组中创建文件内容的解决方案。它包含一个表示每行数据的哈希的引用,其中键是列名,值是该列的数据。然后,您可以使用此哈希值通过API进行更新:
这是通过两个循环完成的:一个使用您的API填充@file_contents
和另一个循环(不过已完成)。没有理由不能在一个循环中完成它。
use strict;
use warnings;
use autodie;
use feature qw(say);
use constant {
FILE_NAME => "...",
};
# Names of the columns
my @column_names = qw( foo bar barfu fubar foofoo barbar );
open my $fh, "<", FILE_NAME;
#
# This builds your Array of Column hashes
#
my @file_contents;
while ( my $row = <$fh> ) {
chomp $row;
@cols = split /\s*\|\s*/, $row;
my %col_hash;
for $col_num ( 0.. $#file_contents ) {
%col_hash{ $col_name[ $col_num ] } = $cols[ $column_num ];
}
push @file_contents, \%col_hash;
}
for my $cols_ref ( @file_contents ) {
my %col_hash = %{ $cols_ref };
API_CALL (..., ..., %col_hash );
}
如果这确实是哈希的哈希值,那就是表的行是哈希条目,你必须让我知道密钥的来源。表的第一列很可能是其余数据的关键。例如,让我们说你的表看起来像这样:
Visitors in thousands
city |jan |apr |july|oct|
Duluth|0 |0 |0 |0
NYC |500 |1200|1500|600
Miami |1200|1600|2300|200
我可以想象 city 是每行的关键,而月份是每列的关键。我可以谈谈这个:
say "The number of people in NYC in July is " . $visitors{NYC}->{july};
您的数据是这种情况吗?如果没有,哈希的键是什么?当然,我不应该为散列键组成随机值。
您必须更清楚地说明您的需求。