我有一个由$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");
}
我做错了什么?
答案 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
是您想要的值列表。