Perl CGI读取固定宽度列文件时多空格丢失问题求助
问题原因与解决方案
首先得澄清一个关键点:Perl在读取文件时并没有把多空格替换成单个空格,你看到的“多空格变单个”是浏览器的HTML渲染规则导致的!
为什么会出现这个现象?
你的测试代码是把读取到的行直接输出到HTML页面里(print "<br>line is $ll";),而浏览器默认会把HTML中的连续空白字符(包括多个空格、制表符、换行)合并成一个空格显示。所以实际上变量$ll里完全保留了文件中的原始多空格,只是浏览器显示的时候“看起来”被合并了。
你可以做个简单验证:在循环里加上一行代码打印行的长度,或者把输出用<pre>标签包裹,就能看到原始的空格了:
while (my $ll =<$fh>) { # 打印行的原始长度,验证多空格是否存在 print "<br>Line length: " . length($ll) . "<br>"; # 用pre标签包裹,保留原始格式 print "<pre>Original line: $ll</pre>"; }
如何正确处理固定宽度列?
既然Perl已经正确读取了包含多空格的原始行,你完全可以直接用substr提取各列,不受浏览器显示的影响。比如你的文件是4列,假设各列宽度分别是10、15、8、12,代码可以这么写:
while (my $ll =<$fh>) { chomp $ll; # 去掉末尾的换行符(可选,根据你的需求) my $col1 = substr($ll, 0, 10); my $col2 = substr($ll, 10, 15); my $col3 = substr($ll, 25, 8); my $col4 = substr($ll, 33, 12); # 可以对提取的列做去首尾空格处理(如果需要) $col1 =~ s/^\s+|\s+$//g; # 输出到浏览器时如果要保留格式,用pre或者处理空格 print "<pre>Col1: '$col1' | Col2: '$col2' | Col3: '$col3' | Col4: '$col4'</pre><br>"; }
额外提示
如果你的CGI输出需要在浏览器中正确显示原始的多空格,除了用<pre>标签,还可以把空格替换成HTML的非断空格 ,不过<pre>更适合展示原始文本格式。
内容的提问来源于stack exchange,提问作者Cris
相关产品推荐
相关产品推荐

