每当发生截断时,我都会从文本文件中输出行号。 我成功地获得了大多数截断行的输出。
但是,截断的线路输出相差 2。 以下是我的代码中发生的情况:
Rain
,一个字符串,位于输入文本文件的第 1 行(见下文(。 应用正则表达式s/.{4}K.*//s
截断为 4 个,Rain
输出被截断,即使它没有被截断(Rain
是 4 个字符,无需缩短(。 此外,它发生在 5,s/.{5}K.*//s
.
正确无误地,代码在截断 3 或更少时输出截断的行。
使用s/.{4}K.*//s
和s/.{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;
};