Perl入门求助:Echo程序写入文件后无法正确回显数据
问题分析与修复方案
你的代码在文件回显部分存在几个关键问题,同时还有统计逻辑的小疏漏,下面逐一说明并修复:
核心问题点
- 写入文件未保留换行结构:
chomp已经去掉了输入的换行符,但你写入文件时只输出了$text,导致所有输入内容被拼接成一行,读取时无法正确分行回显。 - 读取文件循环语法错误:
while(<$fh>{缺少闭合括号,正确写法是while(<$fh>) {。 - 读取文件未赋值行内容:循环里没有把读取到的行赋值给变量,导致打印的是之前循环残留的
$text值,而非文件内的实际内容。 - 文件句柄未关闭就复用:写入后直接重新打开同一个句柄读取,可能因缓存未刷新导致读取不完整内容。
- 终止空行被错误统计:用来终止输入的空行也被计入了行数、长度和字节统计,不符合需求(空行是终止信号,不算有效输入)。
修复后的完整代码
#!/usr/bin/perl use strict; use warnings; # 建议开启,可捕捉更多语法/逻辑问题 my $line_count = 0; my $longest_line = 0; my $total_bytes = 0; print "-----------------------------------\n"; print "Welcome to the Echo Program\n"; print "-----------------------------------\n"; # 打开文件准备写入 open (my $fh, ">", "new.txt") or die "Can't open > new.txt: $!"; print "This program will echo your input.\n\n"; print "Enter a line of text. Terminate your input by hitting the Enter key.\n"; while (1) { print "> "; my $text = <STDIN>; chomp($text); # 自动适配Windows/Unix换行符差异 # 空行直接终止循环,不统计 last if $text eq ''; # 写入文件时添加换行符,保留每行结构 print $fh "$text\n"; my $line_length = length($text); $longest_line = $line_length if $line_length > $longest_line; $total_bytes += length($text); $line_count++; # 实时回显输入内容 print "->$text<-\n"; } close $fh; # 关闭写入句柄,确保内容全部写入文件 print "\nHere is the text that you entered:\n"; print "----------------------------------\n"; # 重新打开文件读取 open ($fh, "<", "new.txt") or die "Can't open < new.txt: $!"; while (my $line = <$fh>) { chomp($line); # 去除文件里的换行符,避免输出多空行 print "->$line<-\n"; } close $fh; print "\n$line_count lines, longest $longest_line characters, $total_bytes bytes total.\n";
额外说明
- 加入
use strict;和use warnings;是Perl编程的好习惯,能提前发现很多潜在问题。 - 调整了空行判断的位置,确保终止输入的空行不会被统计到有效数据里。
- 写入文件时添加
\n,保证每行内容在文件中独立存储,读取时能正确分行。 - 读取文件时用
my $line = <$fh>获取每行内容,避免变量污染。
内容的提问来源于stack exchange,提问作者kmitch80
相关产品推荐
相关产品推荐

