Вы были очень близки. Чтобы ваша программа работала так, как вы ожидали, мне нужно было сделать всего пару изменений.
У вас есть этот код:
<INFILE> or die "Bad file format";
my $model = INFILE;
Я думаю, вы пытаетесь убедиться, что на самом деле есть другая строка после той, которую вы сопоставили Но в первой из этих строк вы просто читаете следующую строку и выбрасываете данные. И во второй из этих строк вы устанавливаете $model
в строку «INLINE». Возможно, вы имели в виду my $model = <INFILE>
- но даже это не дает вам того, что вы хотите, поскольку вы уже прочитали (и удалили) запись, которую вы хотите в предыдущей строке кода.
Так что я думаю, что вы хотите заменить эти две строки одной строкой.
my $model = <INFILE> or die "Bad file format";
Если вам интересно, вот как я это напишу. Обратите внимание, я избавился от жестко закодированного имени файла. Вместо этого я читаю из общего файлового дескриптора <>
. Это автоматически связано с файлом, имя которого передается программе в командной строке. Преимущество этого в том, что код а) легче писать (так как вам не нужно явно открывать файл) и б) более гибок (так как вы можете обрабатывать файл с любым именем). Я также удалил несколько ненужных вариантов использования $_ =~
.
#!/usr/bin/perl
# Always use these
use strict;
use warnings;
use feature 'say'; # for 'say()'
while (<>) {
s/^\s+//; # No need for $_ =~
s/\s+$//;
if (/work/) {
my $model = <> or die "Bad file format";
if ($model =~ /^good/) {
say 'found good word';
} else {
say 'no good word';
}
}
}