Perl文件读取:在列表上下文中读取时组合多行

Perl文件读取:在列表上下文中读取时组合多行,perl,Perl,我正在使用以下代码读取文件: open ($myfile, "<file.txt") or die "Could not open the file"; @lines = <$myfile>; foreach $line (@lines){ print $line; } close myfile; 但程序的输出是: Hellhound on My Trailsuesdudgement Day 看起来代码只读取一行,并用读取的新行替换第一个字符。我尝试了不同的文

我正在使用以下代码读取文件:

open ($myfile, "<file.txt") or die "Could not open the file";

@lines = <$myfile>;

foreach $line (@lines){
    print $line;
}

close myfile;
但程序的输出是:

Hellhound on My Trailsuesdudgement Day

看起来代码只读取一行,并用读取的新行替换第一个字符。我尝试了不同的文件。只打印一行,这基本上是所有行的聚合。

请检查您的原始脚本和发布的脚本是否相同。 您确实提到最后一行仅由示例程序打印。不会的。它将打印整行

始终放置
使用警告
使用严格位于程序顶部

然后将整个文件存储到数组中,然后从数组中读取是一种非常糟糕的方法。使用while循环代替

open ($myfile, "<","file.txt") or die "Could not open the file";

 while(<$myfile>)
 {
     print ; # Data are store into the default variable $_. So no need to mention the $_ in print statement.

 }

如果要将特定数据存储到另一个变量中,请查看字符串($)的连接和数组(@)的推送或取消移动。

请检查原始脚本和发布的脚本是否相同。 您确实提到最后一行仅由示例程序打印。不会的。它将打印整行

始终放置
使用警告
使用严格位于程序顶部

然后将整个文件存储到数组中,然后从数组中读取是一种非常糟糕的方法。使用while循环代替

open ($myfile, "<","file.txt") or die "Could not open the file";

 while(<$myfile>)
 {
     print ; # Data are store into the default variable $_. So no need to mention the $_ in print statement.

 }

如果要将特定数据存储到另一个变量中,请查看字符串($)的串联和数组(@)的推送或取消移位。

原始文件在每行末尾只有一个回车符(CR),而它应该有换行符(LF)或者可能是CR和LF,如果它来自Windows系统,并且您正在Linux上阅读它

没有任何新行来分割数据,
@lines
只有一个元素,其中包含整个文件内容

如您所见,将该文本打印到终端会导致所有行显示在彼此的顶部

您需要修复文件的创建,但同时可以通过如下更改Perl的记录分隔符来正确读取文件

use strict;
use warnings 'all';

open my $fh, '<', 'file.txt' or die "Could not open the file: $!";

my @lines = do {
    local $/ = "\r";
    <$fh>;
};

chomp @lines;

print "$_\n" for @lines;
使用严格;
使用“全部”警告;

打开我的$fh,“您的原始文件在每行末尾只有一个回车符(CR),而它应该有换行符(LF),或者如果它来自Windows系统,并且您正在Linux上读取它,则可能同时有换行符(CR)和换行符(LF)

没有任何新行来分割数据,
@lines
只有一个元素,其中包含整个文件内容

如您所见,将该文本打印到终端会导致所有行显示在彼此的顶部

您需要修复文件的创建,但同时可以通过如下更改Perl的记录分隔符来正确读取文件

use strict;
use warnings 'all';

open my $fh, '<', 'file.txt' or die "Could not open the file: $!";

my @lines = do {
    local $/ = "\r";
    <$fh>;
};

chomp @lines;

print "$_\n" for @lines;
使用严格;
使用“全部”警告;

打开我的$fh,'完美答案。我学到了很多。正如您所说的,我是一个Perl代码初学者。你能给我推荐一些Perl实践资源吗?我目前正在使用威利-任何其他资源都将不胜感激。@Aditya:我很乐意提供帮助。有几个网站,比如和,在各个层面都有非常有用的练习。一旦你变得更加熟练,最好尝试在堆栈溢出上回答问题,如果你的代码特别好或不好,你会得到反馈。完美的答案。我学到了很多。正如您所说的,我是一个Perl代码初学者。你能给我推荐一些Perl实践资源吗?我目前正在使用威利-任何其他资源都将不胜感激。@Aditya:我很乐意提供帮助。有几个网站,比如和,在各个层面都有非常有用的练习。一旦您变得更加熟练,最好尝试在堆栈溢出上回答问题,如果您的代码特别好或不好,您将获得反馈。