2

我正在尝试打印数组,但输出仅包含数组的最后一行。部分代码如下。

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...

我有点困惑为什么同一阵列上的结果不同。

4

3 回答 3

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 ;
}

您可能已经chomp对来自不同操作系统(DOS、Windows)的文件的行执行了操作,这不会去除\r行尾。因此,当打印行时,行会相互覆盖。

如果这是错误的,解决方案是使用该dos2unix工具来修复您的文件,或使用:

s/\s+\z//; 

剥离你的换行符。

您可以使用模块检查您的输入Data::Dumper,使用选项Useqq,例如:

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

如果这些空白字符在您的输出中,那么它们将是可见的。

于 2012-09-18T18:15:24.963 回答
2

问题就在这里

open OUT, "> /myFile.txt"

这应该是

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

您编写的内容会覆盖 foreach(@result) 循环的每次迭代的整个文件。您打算做的是附加到它(“>>”)。">>" 追加,">" 覆盖。

还要注意我是如何将“>> /myfile.txt”分解为“>>”、“/myfile.txt”的。对于不太具体的开放应用程序,这既更安全,也更健壮。

于 2012-09-19T12:12:53.133 回答
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";
}
于 2012-09-18T18:35:27.930 回答