Perl读取多行文本文件仅输出首行,如何实现全内容打印?
问题:Perl读取文件仅输出部分内容,如何打印全部行?
Hey there! Let's break down what's happening here and fix it up.
首先,你的原代码里用了 my $text = <$fh> —— 在Perl里,当你把文件句柄的读取操作放在标量上下文(也就是赋值给单个变量)时,它只会读取第一行内容。如果你的input.txt里"Hello my"后面刚好有个换行(比如你输入的时候不小心敲了回车),那自然只会输出这第一行的内容。
要读取并打印整个文件的内容,有几种实用的方法,根据你的需求选就行:
方法1:一次性读取所有行到数组(适合小文件)
把读取操作放在列表上下文(赋值给数组),就能一次性把所有行读进来,然后直接打印整个数组:
use strict; use warnings; open(my $fh, "<", "input.txt") or die "cannot open input text!"; my @all_lines = <$fh>; # 列表上下文:读取全部行到数组 print @all_lines; # 打印所有内容,保留原换行格式 close $fh; # 记得关闭文件句柄,养成好习惯
方法2:修改输入记录分隔符,一次性读入整个文件(适合小文件)
Perl有个特殊变量$/,默认是换行符,控制<$fh>每次读取的"记录"长度。把它设为undef,就能一次性读取整个文件到单个标量里:
use strict; use warnings; open(my $fh, "<", "input.txt") or die "cannot open input text!"; local $/; # 局部修改分隔符,只在当前作用域生效,不影响其他代码 my $full_text = <$fh>; print $full_text; close $fh;
用local很重要,它只会在当前代码块里修改$/,不会污染全局环境。
方法3:逐行读取打印(适合大文件)
如果你的文件很大,一次性加载到内存会很占资源,那就用while循环逐行读取打印,这样内存占用会小很多:
use strict; use warnings; open(my $fh, "<", "input.txt") or die "cannot open input text!"; while (my $line = <$fh>) { # 每次循环读取一行,直到文件结束 print $line; } close $fh;
至于你原代码只输出"Hello my",大概率是你的input.txt里"Hello my"后面有个换行符,导致<$fh>只读到了那一行。不管怎样,上面的方法都能帮你打印出整个文件的内容。
内容的提问来源于stack exchange,提问作者JF Forget
相关产品推荐
相关产品推荐

