проблема чтения строки после совпадения первой строки - PullRequest
0 голосов
/ 08 января 2019

Не уверен, почему этот скрипт не работает. Кто-нибудь может предложить исправление, чтобы получить ожидаемый результат?

Скрипт Perl:

open(INFILE,"test_input.txt")||die "can't open the file";   
while(<INFILE>){    
$_=~s/^\s+//;    
$_=~s/\s+$//;    
    if ($_ =~ /work/){    
        <INFILE> or die "Bad file format";    
        my $model = INFILE;    
        print "line below search: $model\n";    
        if ($model =~/^good/){    
            print "found good word\n";    
        }    
        else{    
            print "no good word\n";    
        }    
    }    
}    

входной файл:

employment  
work hard  
good people

Ожидаемый результат:

line below search: good people
found good word

Фактический объем производства:

line below search:
no good word

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Вы были очень близки. Чтобы ваша программа работала так, как вы ожидали, мне нужно было сделать всего пару изменений.

У вас есть этот код:

<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';
    }
  }
}
0 голосов
/ 08 января 2019

Попробуй это. Считать файл в массив. Процесс построчно. Вы можете проверить текущую и следующую строку.

my $file = 'testFile.txt';
open my $fh, "<", "test_input.txt" or die "can't open the file"; 
chomp(my @data = <$fh>);
close $fh;

for my $index (0..$#data) { 
    if($data[$index] =~ /work/){
        my $nextIndex = $index + 1;
        die "Bad file format" unless(defined $data[$nextIndex]);
        print "line below search: $data[$nextIndex]\n";
        if ($data[$nextIndex] =~/^good/){
            print "found good word\n";
        }
        else{
            print "no good word\n";
        }
    }
}
...