如何在制表符上拆分Perl中的变量?

时间:2013-04-23 13:13:42

标签: perl

我有一个由$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"); 
}

我做错了什么?

2 个答案:

答案 0 :(得分:6)

如果没有参数,split会分割$_的值。你想要split(/\t/, $result);

此外,while看起来不对。也许你想要

for my $r (split (/\n/, $result)) {
    @columns = split (/\t/, $r);
    :

答案 1 :(得分: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是您想要的值列表。