Перл:Цикл по строкам ввода с использованием индексного подхода

StackOverflow https://stackoverflow.com/questions/893173

  •  23-08-2019
  •  | 
  •  

Вопрос

Это вопрос из практики Perl для начинающих.Я новичок в этом языке.Вопрос в том:

Если я хочу обработать выходные строки программы, как мне отформатировать ПЕРВУЮ СТРОКУ особым образом?

Я думаю о двух возможностях:

1) Устанавливается переменная-флаг после первого выполнения цикла.Но оно будет оцениваться для каждого цикла.ПЛОХОЕ решение

2) Цикл на основе индекса (например, «for»).Затем я бы начал цикл с i=1.Это решение намного лучше.Проблема в том, КАК Я МОГУ ЭТО СДЕЛАТЬ?

Я только что нашел код для цикла с конструкцией while ( <> ).

Здесь лучше видно:

$command_string = "par-format 70j p0 s0 < " . $ARGV[0] . "|\n";                                                                                

open DATA, $command_string  or die "Couldn't execute program: $!";

print "\t    <div>&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;|-- <strong>Description</strong></div>\n";
while ( defined( my $line = <DATA> )  ) {
   chomp($line);
   # print "$line\n";
   print "\t    <div>&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;|&‎nbsp;&‎nbsp;&‎nbsp;-- " . $line  . "</div>\n";
}

close DATA;

Пожалуйста, не стесняйтесь исправлять любой код здесь, это мое первое стихотворение на Perl.

Спасибо!

Это было полезно?

Решение

Вы всегда можете использовать $. или английское название $INPUT_LINE_NUMBER для управления логикой в ​​вашем цикле с помощью:

while (my $line = <>) {
    if ($. == 1) {
        # do cool stuff here
    }
    # do normal stuff here
}

Другие советы

Чтобы обработать первую строку по-другому, вы можете просто поставить

$line = <DATA>;

над вашей петлей.

При правильной проверке проблем чтения (пустой файл и т. д.) это должно быть

if ($line = <DATA>) {
    ...do special things...
}

while (my $line = <DATA>) {
    ...do regular things...
}

Я не уверен насчет defined() вызов.Возможно, вам это не понадобится, поскольку пустая строка имеет ложное истинное значение.

С точки зрения «лучших практик» в этом примере кода есть много ошибок:

open DATA, $command_string  or die "Couldn't execute program: $!";
  • Дыра в безопасности, пожалуйста, используйте меня.
  • ДАННЫЕ — это магическая величина, указывающая на __DATA__ раздел в конце текущего файла.
  • Вы должны использовать

    open my $fh 
    

    Который использует лексическую переменную для дескриптора файла вместо глобальной.

  • Вы должны использовать 3 открытых аргумента, т.е.:

    open my $fh, '<'  , $filename
    open my $fh, '-|' , $command
    open my $fh, '-|' , $command, @args 
    

    к сожалению, мне еще предстоит понять, как 3-arg работает с двумя каналами.Там это ipc :: open2 вещь, но я еще не выработал, как использовать это эффективно.Предложения приветствуются.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top