Perl CGI脚本循环打印文件内容时特定行输出异常求助
问题原因及解决方案
核心问题
浏览器把文件里的<BBBBBBBB44444444>当成了HTML标签(因为以<开头),但这不是有效的HTML元素,所以浏览器直接忽略了从<到>之间的内容,导致该行只显示in[ 41: ]。另外原代码没处理HTML转义,也没保留文本格式,导致空格、换行显示异常。
修复步骤
- 转义HTML特殊字符:用
HTML::Entities模块把<、>这类字符转成HTML实体(比如<、>),避免被浏览器当作标签解析。 - 保留文本格式:把输出内容包在
<pre>标签里,让浏览器保留原始的空格、换行格式。 - 优化文件读取:直接用Perl内置的
open函数读文件,替代调用cat命令的低效写法。
修正后的代码
use CGI; use HTML::Entities; my $q = CGI->new; for ($q->param('menu')) { /^(1)$/ and do { # 直接打开文件读取内容 open my $fh, '<', '/tmp/int_rej_sample.txt' or die "无法打开文件: $!"; my @Sample = <$fh>; close $fh; # 输出正确的HTTP头部和pre标签 print $q->header('text/html'); print "<pre>"; foreach (@Sample) { # 转义HTML实体后打印 print encode_entities($_); } print "</pre>"; }; }
说明
encode_entities函数会自动转义所有HTML特殊字符,确保文件内容原样显示。<pre>标签强制浏览器按原始文本格式渲染,保留换行和空格。- 用
CGI模块的header方法输出正确的HTTP头部,避免浏览器解析错误。
内容的提问来源于stack exchange,提问作者Bassem Abd Elmaksoud
相关产品推荐
相关产品推荐

