我正在尝试打印数组,但输出仅包含数组的最后一行。部分代码如下。
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...
我有点困惑为什么同一阵列上的结果不同。
我正在尝试打印数组,但输出仅包含数组的最后一行。部分代码如下。
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...
我有点困惑为什么同一阵列上的结果不同。
凭直觉,我尝试添加\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;
如果这些空白字符在您的输出中,那么它们将是可见的。
问题就在这里
open OUT, "> /myFile.txt"
这应该是
open OUT, ">>", "/myfile.txt"
您编写的内容会覆盖 foreach(@result) 循环的每次迭代的整个文件。您打算做的是附加到它(“>>”)。">>" 追加,">" 覆盖。
还要注意我是如何将“>> /myfile.txt”分解为“>>”、“/myfile.txt”的。对于不太具体的开放应用程序,这既更安全,也更健壮。
通过清除行尾的空格并在打印时将其添加回来,可以轻松修复来自任何平台的外行终止符
像这样
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";
}