Perl数组的哈希和一些问题

and*_*ejr 3 arrays perl hash

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

a,b
a,d
a,f
c,h
c,d
Run Code Online (Sandbox Code Playgroud)

所以我将这些保存到散列中,使得键"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);
Run Code Online (Sandbox Code Playgroud)

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

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

文件"a"看起来像这样:

b
d
f

<end of file>
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?我尝试过的一切都不起作用,我对哈希不太熟悉/经验......

提前致谢 :)

ike*_*ami 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");
   }
}
Run Code Online (Sandbox Code Playgroud)

我编写了内部循环,就像我所做的那样,展示了读写之间的对称性,但它也可以写成如下:

print($fh_out "$_\n") for @{ $foos_by_cat{$cat} };
Run Code Online (Sandbox Code Playgroud)

  • @jaypal,代码结构.将输入逻辑与输出逻辑分开.输出代码没有理由可以访问输入代码使用的变量. (2认同)
  • 大多数程序都比较复杂,并且会使用实际的子程序. (2认同)

Bor*_*din 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;
}
Run Code Online (Sandbox Code Playgroud)