Перл:Цикл по строкам ввода с использованием индексного подхода
-
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>          |-- <strong>Description</strong></div>\n";
while ( defined( my $line = <DATA> ) ) {
chomp($line);
# print "$line\n";
print "\t <div>          |   -- " . $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 вещь, но я еще не выработал, как использовать это эффективно.Предложения приветствуются.