perl仅打印数组的最后一行

perl仅打印数组的最后一行,perl,Perl,我试图打印数组,但输出仅包含数组的最后一行。部分代码如下所示 open OUT, "> /myFile.txt" or die "Couldn't open output file: $!"; foreach (@result) { print OUT; } 输出是 List Z 这是最后一行,但当我打印@result时,输出是 List A List B List C so on... 我有点搞不懂为什么在同一个数组上结果会不同。根据直觉,我尝试将\r添加

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

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

foreach (@result) {

    print OUT;
}
输出是

List Z
这是最后一行,但当我打印@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 ;
}
您可能在不同操作系统(DOS、Windows)的文件行上执行了
chomp
,这不会去除
\r
行结尾。因此,打印这些行时,这些行会相互覆盖

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

s/\s+\z//; 
删除你的新行

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

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

如果输出中有这些空白字符,则它们将可见。

任何平台的外线终止符都可以通过清除行尾的空白并在打印时将其添加回来轻松修复

像这样

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

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

问题就在这里

open OUT, "> /myFile.txt"
这应该是

open OUT, ">>", "/myfile.txt"
您编写的内容将覆盖foreach(@result)循环每次迭代的整个文件。 您要做的是将其追加(“>>”)。 “>>”追加“>”覆盖

还要注意我是如何将“>>/myfile.txt”分解为“>>”、“/myfile.txt”的。
这对于不太特定的open应用程序来说更安全,也更健壮。

非常感谢,我使用了你的建议,但问题仍然没有解决。我无法想象为什么。替换将删除字符串末尾的所有回车符和换行符。如果您对循环使用了不同的变量,那么您需要在替换中显式地使用该变量。我已经添加到我的答案来证明这一点谢谢,你解决了这个问题,输入来自网页,并有空白字符。我已尝试根据您的建议删除,但最后一行仍然打印。您是否尝试使用Data::Dumper打印这些行以查看空白?是的,先生,打印方式如下:
$VAR1=[“list\t200\r\n”,undf]
然后你没有尝试
s/\s+\z/
,因为那些字符当时会被剥离。我尝试了
foreach(@result){s/\s+\z/;print Dumper\@result;
这个修改带来了结果非常…非常有趣…就是这样。解决了!非常感谢。如果
open
语句在for循环中,这将是正确的诊断。如果是,那么正确的解决方案是将open语句移到外部,而不是使用每个迭代的追加模式。TLP,你是对的。我感觉open语句嵌套在一个更大的块中,他希望这个更大块的每次迭代都打印出他存储在@result中的不同列表。谢谢你告诉我哪里错了,TLP.)
open OUT, ">>", "/myfile.txt"