You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 14:17:31