2

我有一个$results由以下foreach循环生成的变量

my $result = "";
foreach $c1(sort {$a<=>$b} keys %info ) {
    $result .= $c1 . "\t" .
      join(',',@{$info{$c1}->{var1}}) . "\t" . 
      join(',',@{$info{$c1}->{var2}}) . "\n";
}

如果我打印结果,它看起来像这样

a    b    c
c    d    e
f    g    h

所以三列由 分隔,\t行由 分隔\n。我现在想$results按选项卡拆分这个变量,最终得到 3 列。我试图用一个while循环来做到这一点,但它不起作用

while($result){
    my @columns = split("\t"); 
}

我究竟做错了什么?

4

2 回答 2

6

没有参数,split拆分 的值$_。你要split(/\t/, $result);

另外,while外观不对。也许你想要

for my $r (split (/\n/, $result)) {
    @columns = split (/\t/, $r);
    :
于 2013-04-23T13:22:11.743 回答
4

你所写的将产生一个无限循环,因为while ($result) { ... }只要$result是一个真正的价值,它就会继续下去,你的就是。此外,如果您确实按照自己的意愿拆分它,您会得到

("a", "b", "c\nd", "e", "f\ng", "h", "i")

我认为这不是你想要的。

您不应该将所有数据与选项卡连接在一起,然后再次拆分。将其作为单独的项目保存。就像是

my @results;

foreach my $c1 (sort { $a <=> $b } keys %info ) {
  push @results, [
    $c1,
    join ',', @{ $info{$c1}{var1} },
    join ',', @{ $info{$c1}{var2} }
  ];
}

然后,您将拥有与最初打印的数据相对应的数组数组。Data::Dump如果您愿意,您可以将其打印出来用于诊断目的。


更新

由于您想保留第一列的值,它们是 has 的排序键,您最好在循环之前单独保存它们。也许这个代码更适合你?

my @keys = sort { $a <=> $b } keys %info;
my @results;

foreach my $c1 ( @keys ) {
  push @results, [
    $c1,
    join ',', @{ $info{$c1}{var1} },
    join ',', @{ $info{$c1}{var2} }
  ];
}

现在@keys是您想要的值列表。

于 2013-04-23T13:21:08.607 回答