Perl数组的哈希和一些问题

时间:2014-08-05 14:08:06

标签: arrays perl hash

我目前有一个csv文件,如下所示:

a,b
a,d
a,f
c,h
c,d

所以我将这些保存到哈希中,以便键和#34; 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);

不确定效率,但在我进行数据转储时似乎有效......

现在,我遇到的问题是这个;我想为每个键创建一个新文件,在每个文件中我都要打印键中的每个元素,如下:

file&#34; a&#34;看起来像这样:     

b
d
f

<end of file>

有什么想法吗?我尝试过的所有东西都不起作用,我对哈希不太熟悉/经验......

提前致谢:)

2 个答案:

答案 0 :(得分:5)

#!/usr/bin/perl

use strict;
use warnings;

my %foos_by_cat;

{
   open(my $fh_in, '<', ...) or die $!;
   while (<$fh_in>) {
      chomp;
      my ($cat, $foo) = split /,/;
      push @{ $foos_by_cat{$cat} }, $foo;
   }
}

for my $cat (keys %foos_by_cat) {
   open(my $fh_out, '>', $cat) or die $!;
   for my $foo (@{ $foos_by_cat{$cat} }) {
      print($fh_out "$foo\n");
   }
}
我正如我所做的那样编写了内部循环来展示读写之间的对称性,但它也可以写成如下:

print($fh_out "$_\n") for @{ $foos_by_cat{$cat} };

答案 1 :(得分:5)

使用each迭代器,输出过程非常简单,它为单个调用中的下一个哈希元素提供键和值对

use strict;
use warnings;
use autodie;

open my $fh, '<', 'myfile.csv';

my %data;

while (<$fh>) {
   chomp;
   my ($cat, $val) = split /,/;
   push @{ $data{$cat} }, $val;
}

while (my ($cat, $values) = each %data) {
   open my $out_fh, '>', $cat;
   print $out_fh "$_\n" for @$values;
}