Как я могу напечатать строки, которые соответствуют шаблону в Perl? - PullRequest
4 голосов
/ 01 апреля 2010

Предполагая, что file.txt имеет только одно предложение в каждой строке следующим образом:

John Depp is a great guy.  
He is very inteligent.  
He can do anything.  
Come and meet John Depp.

Код Perl выглядит следующим образом: -

open ( FILE, "file.txt" ) || die "can't open file!";
@lines = <FILE>;
close (FILE);
$string = "John Depp";
foreach $line (@lines) {
    if ($line =~ $string) { print "$line"; }
}

Выходными данными будут первая и четвертая строка.

Я хочу, чтобы он работал для файла со случайными переносами строк, а не с одним английским предложением на строку Я имею в виду, что это также должно работать для: -

John Depp is a great guy. He is very intelligent. He can do anything. Come and meet John Depp.

Выходные данные должны быть в первом и четвертом предложениях.

Есть идеи, пожалуйста?

Ответы [ 6 ]

2 голосов
/ 01 апреля 2010

Более просто: если вы предполагаете, что «предложения» разделены точками, вы можете использовать это как разделитель полей:

 $/ = '.';
 while(<>) {
        print if (/John Depp/i);
 }
2 голосов
/ 01 апреля 2010

Во-первых, обратите внимание, что имя известного актера Джонни Депп .

Во-вторых, выяснить, что является предложением, а что нет, сложно. Я собираюсь обмануть и использовать Lingua :: Sentence :

#!/usr/bin/perl

use strict; use warnings;

use Lingua::Sentence;

my $splitter = Lingua::Sentence->new('en');

while ( my $text = <DATA> ) {
    for my $sentence ( split /\n/, $splitter->split($text) ) {
        print $sentence, "\n" if $sentence =~ /John Depp/;
    }
}

__DATA__
John Depp is a great guy.
He is very intelligent.
He can do anything.
Come and meet John Depp.
John Depp is a great guy. He is very intelligent. He can do anything. Come and meet John Depp.

Выход:

John Depp is a great guy.
Come and meet John Depp.
John Depp is a great guy.
Come and meet John Depp.
1 голос
/ 26 мая 2016

Если у вас есть содержимое в строке:

my $content = "John Depp is a great guy.  
He is very intelligent.  
He can do anything.  
Come and meet John Depp.";

my @arr = $content =~ /.*John Depp.*/mg;
foreach my $a (@arr) {
    print "$a\n";
}

Результат:

Джон Депп отличный парень.
Приходите и познакомьтесь с Джоном Деппом.

Вы можете изменить регулярное выражение, если хотите извлечь только интересную часть, например:

my @arr = $content =~ /is (\w+? ?\w+ \w+)./mg;

Результат:

отличный парень

очень умный

0 голосов
/ 01 апреля 2010

Глядя на ваш оригинальный код, а не на конкретный ответ на ваш вопрос. Обычно плохая идея читать весь файл в память, если вам не нужно. Вы можете обрабатывать файл построчно как

open ( FILE, "file.txt" ) || die "can't open file!";
$string = "John Depp";
while (<FILE>) {
   if (/$string/) { print }
}
0 голосов
/ 01 апреля 2010

Переменные по умолчанию могут быть забиты, если не соблюдать осторожность. Так что называть все это хорошая идея.

Это должно помочь вам начать:

#!/usr/bin/perl -w

use strict;

my $targetString = "John Depp";

while (my $line = <STDIN>) {
    chomp($line);
    my @elements = split("\\.", $line);
    foreach my $element (@elements) {
        if ($element =~ m/$targetString/is) {
            print trim($element).".\n";
        }
    }
}

sub trim {
    my $string = shift;
    $string =~ s/^\s+//;
    $string =~ s/\s+$//;
    return $string;
}

Использование:

$ depp.pl < file
John Depp is a great guy.
Come and meet John Depp.
John Depp is a great guy.
Come and meet John Depp.
0 голосов
/ 01 апреля 2010

в одну сторону

while(<>){
 if (/John Depp/i){
   @s = split /\s*\.\s*/;
   foreach my $line (@s){
      @f=split /\s*\.\s*/ , $line;
      foreach my $found (@f){
        if ($found =~/John Depp/i) {
           print $found."\n";
        }
      }
   }
 }
}

выход

$ cat file
John Depp is a great guy.
He is very inteligent.
He can do anything.
Come and meet John Depp.
John Depp is a great guy. He is very inteligent. He can do anything. Come and meet John Depp.

$ perl perl.pl file
John Depp is a great guy
Come and meet John Depp
John Depp is a great guy
Come and meet John Depp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...