Усечение Perl отключено на 2 при выводе номера строки для усеченной строки - PullRequest
0 голосов
/ 27 сентября 2018

Я вывожу номера строк из текстового файла для случаев, когда происходит усечение.Успешно получаю вывод для большинства усеченных строк.

Однако усеченный линейный выход отключен на 2.Вот что происходит в моем коде:

Rain, строка, находится в строке 1 входного текстового файла (см. Ниже).Применен RegExp 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 не отображает вывод усечения для номера строки.

Мой текстовый файл - weather.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 = "%-20s\n";

print sprintf($fmt, "Column 1");

foreach my $i (0..$max-1) {
    print sprintf($fmt, ($lines[$i] or $none), ($lines[$i] or $none));
}

1 Ответ

0 голосов
/ 27 сентября 2018

Скорее всего, ваш текстовый файл содержит возврат каретки и символ перевода строки в конце каждой строки.Вызов chomp удаляет только символ перевода строки, оставляя вас с 5 символами в строках.

Хорошим подходом является print ваш ввод с некоторыми разделителями вокруг него для проверки:

print "<<$_>>\n";

В качестве альтернативы, вы можете использовать Data :: Dumper для проверки ваших данных:

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

Лично мне действительно нравится удалять все пробелы в конце строк ввода, какв любом случае его редко требуется:

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