2012-09-18 51 views
2

我想打印数组,但输出只包含数组的最后一行。部分代码如下。perl只打印数组的最后一行

open OUT, "> /myFile.txt" 
    or die "Couldn't open output file: $!"; 

foreach (@result) { 

    print OUT; 
} 

的出卖出期权

List Z 

这是最后一行,但是当我做print "@result"了出来说就是

List A 

List B 

List C so on... 

我有点迷惑,为什么结果不同在同一个阵列上。

回答

2
时固定

问题在这里

open OUT, "> /myFile.txt" 

这应该是

open OUT, ">>", "/myfile.txt" 

你写的覆盖对foreach(@result)循环的每个迭代整个文件。 你打算做的是追加到它(“>>”)。 “>>”追加,“>”覆盖。

另外请注意我是如何将“>> /myfile.txt”分解为“>>”,“/myfile.txt”的。 这对于开放性较低的特定应用程序来说更安全,更健壮。

+0

。解决了!非常感谢你。 – eli1128

+1

如果'open'语句位于for循环中,这将是正确的诊断。如果是这样,那么正确的解决方案是将open语句移到外面,而不是每次迭代使用append模式。 – TLP

+0

TLP,你是对的。我有一种感觉,这个开放的声明嵌套在一个更大的块中,并且他期望每个更大块的迭代打印出他存储在@result中的不同列表。感谢您向我展示我错在哪里,TLP。 :) – protist

7

工作的预感,我试着在输入行的末尾添加\r,果然,它会产生幻觉,只有输入的最后一行被打印到文件中。下面就来测试它的代码:

use strict; 
use warnings; 

my @result = map "$_\r", 'A' .. 'Z'; 

open (OUT, "> myFile.txt") or die("Couldn't open output file: $!"); 
foreach (@result) { 
    print OUT ; 
} 

什么你可能做的是从不同的操作系统(DOS,Windows)中,不剥离\r行结尾进行chomp上线从一个文件中。因此,打印行时,这些行将相互覆盖。

如果这是什么是错的,解决的办法是使用dos2unix工具来修复您的文件,或者使用:

s/\s+\z//; 

剥去你的换行。

您可以通过使用Data::Dumper模块,使用选项Useqq,例如:

use Data::Dumper; 
$Data::Dumper::Useqq = 1; 
print Dumper \@result; 

如果这些空白字符是在你的输出检查你的输入,然后,他们将是可见的。

+0

谢谢,您指出问题,输入来自网页并具有空格字符。我试图根据你的建议去掉,但最后一行仍然打印。 – eli1128

+0

您是否尝试使用Data :: Dumper打印行以查看空白? – TLP

+0

是的,先生,打印像这样'$ VAR1 = [“list \ t200 \ r \ n”,undef];' – eli1128

0
从任何平台

外资行终止符可以很容易地从该行的结束清除空白和其重新添加打印出来

喜欢这个

open my $out, '>', '/myFile.txt' or die "Couldn't open output file: $!"; 

foreach (@result) { 
    s/\s+$//; 
    print $out "$_\n"; 
} 

foreach my $line (@result) { 
    $line =~ s/\s+$//; 
    print $out "$line\n"; 
} 
+0

非常感谢,我已经使用你的建议,但仍然没有解决问题。 – eli1128

+0

我无法想象为什么。替换将从字符串的末尾删除所有回车符和换行符。如果你为循环使用了一个不同的变量,那么你需要在替换中明确地使用它。我已经添加到我的答案,以证明这非常有趣......这就是它 – Borodin