Perl 截断在输出字符串被截断的行号时为 Off-by-2



每当发生截断时,我都会从文本文件中输出行号。 我成功地获得了大多数截断行的输出。

但是,截断的线路输出相差 2。 以下是我的代码中发生的情况:

Rain,一个字符串,位于输入文本文件的第 1 行(见下文(。 应用正则表达式s/.{4}K.*//s截断为 4 个,Rain输出被截断,即使它没有被截断(Rain是 4 个字符,无需缩短(。 此外,它发生在 5,s/.{5}K.*//s.

正确无误地,代码在截断 3 或更少时输出截断的行。

使用s/.{4}K.*//ss/.{5}K.*//s时如何显示没有截断? 换句话说,当我运行代码以截断 4 或 5 时,Rain 不会显示行号的截断输出。

我的文本文件 - 天气.txt:

Rain
Snow

这是我的代码:

#!/usr/bin/perl
use strict;
use warnings;
my $input = 'weather.txt';
open my $fhIn, '<', $input or die qq(Unable to open "$input" for input: $!);
my @lines;
while( <$fhIn>) {
chomp(@lines);
push @lines, $. if s/.{5}K.*//s;
}
my $max = @lines;
my $none = '-';
my $fmt = "%-20sn";
print sprintf($fmt, "Column 1");
foreach my $i (0..$max-1) {
print sprintf($fmt, ($lines[$i] or $none), ($lines[$i] or $none));
}

最有可能的是,您的文本文件在每行末尾包含一个回车符和一个换行符。chomp调用仅删除换行符,行中留下 5 个字符。

一个好方法是在输入周围使用一些分隔符print输入以检查它:

print "<<$_>>n";

或者,您可以使用 Data::D umper 来检查您的数据:

use Data::Dumper;
$Data::Dumper::Useqq = 1;
print Dumper $_;

就个人而言,我真的很喜欢删除输入行末尾的所有空格, 因为无论如何都很少需要保留它:

while( <$fhIn> ) {
s/s+$//;
push @lines, $. if s/.{5}K.*//s;
};

相关内容

  • 没有找到相关文章

最新更新