Perl: цикл по входным строкам с индексным подходом - PullRequest
3 голосов
/ 21 мая 2009

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

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

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

1) Флаг-переменная, после первого запуска цикла. Но это будет оцениваться для каждого цикла. ПЛОХОЙ раствор

2) Цикл на основе индекса (например, «для»). Тогда я бы начал цикл в 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.

Спасибо!

Ответы [ 3 ]

8 голосов
/ 21 мая 2009

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

while (my $line = <>) {
    if ($. == 1) {
        # do cool stuff here
    }
    # do normal stuff here
}
5 голосов
/ 21 мая 2009

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

$line = <DATA>;

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

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

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

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

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

4 голосов
/ 21 мая 2009

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

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

    open my $fh 
    

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

  • Вы должны использовать 3 arg open, то есть:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...