【发布时间】:2014-08-05 14:08:05
【问题描述】:
我目前有一个如下所示的 csv 文件:
a,b
a,d
a,f
c,h
c,d
所以我将它们保存到一个哈希中,这样键“a”是一个带有“b,d,f”的数组,而键“c”是一个带有“h,d”的数组......这就是我用于:
while(<$fh>)
{
chomp;
my @row = split /,/;
my $cat = shift @row;
$category = $cat if (!($cat eq $category)) ;
push @{$hash{$category}}, @row;
}
close($fh);
不确定效率,但是当我进行数据转储时它似乎可以工作......
现在,我遇到的问题是;我想为每个键创建一个新文件,并且在每个文件中我想打印键中的每个元素,如下所示:
文件“a”看起来像这样:
b
d
f
<end of file>
有什么想法吗?我尝试过的一切都不起作用,我对哈希不太熟悉/经验丰富......
提前致谢:)
【问题讨论】:
-
@ikegami 只是个人喜好......这就是我想说的“如果第一列发生变化,请创建一个新键”。我确信有更方便的方法可以做到这一点,但效率并不是我担心的问题
-
它不会创建新密钥。它只是做一个无用的副本。谁说效率? (对于可能正在阅读的其他人,评论是关于
my $category = ...;是写my $cat = ...; if (!($cat eq $category)) { $category = $cat; }的更好方式。我在举例说明后删除了。) -
@andrejr:为了清晰起见,通常将
if not...写成unless会更好,因此您的声明将变为$category = $cat unless $category eq $cat -
很多人讨厌
unless。使用它并不常见。此外,这里完全没有必要。不仅因为整个语句是有害的不需要,还因为它可以写成if $cat ne $category。