Как использовать Perl regExp для подсчета предложений? - PullRequest
0 голосов
/ 14 апреля 2011

Я по какой-то причине с самого начала боролся с regExp в Perl, и у меня есть быстрый скрипт, который я написал здесь для подсчета предложений в вводимом тексте, который не будет работать.Я просто вернул число 1 в конце и знаю, что в указанном файле их несколько, поэтому число должно быть выше.Я не вижу проблемы ...

#!C:\strawberry\perl\bin\perl.exe

#strict
#diagnostics
#warnings

$count = 0;
$file = "c:/programs/lorem.txt";

open(IN, "<$file") || die "Sorry, the file failed to open: $!";


while($line = <IN>)
{     
    if($line =~ m/^[A-Z]/)
    {
    $count++;
    }
}

close(IN);

print("Sentances count was: ($count)");

Файл lorem.txt находится здесь ......

Lorem ipsum dolor sit amet, consitteur adipiscing elit.Aenean Коммандо Лигула Эгет Долор.Эней Масса.Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem.Nulla Conquat Massa Quis Enim.Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu.В enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo.Nullam dictum felis eu pede mollis pretium.Целочисленная tincidunt.Cras dapibus.Vivamus elementum semper nisi.Aenean vulputate eleifend Tellus.Aenean leo ligula, porttitor eu, краткие биографические данные, eleifend ac, enim.Aliquam Lorem Ante, Dapibus, Viverra Quis, Feugiat, Теллус.Phasellus viverra nulla ut metus varius laoreet.Quisque Rutrum.Энейский импердиет.Etiam ultricies nisi vel augue.Curabitur ullamcorper ultricies nisi.Nam Eget Dui.Этиам Ронкус.Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum.Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem.Maecenas nec odio et ante tincidunt tempus.Done vitae sapien ut libero venenatis faucibus.Nullam Quis Ante.Этим сит амет орси эгет эрос фоцибус опоясывающий лишай.Дуй Лео.Sed Fringilla Mauris Sit Amet Nibh.Donec sodales sagittis magna.Sed Conquat, Leo Eget Bibendum Sodales, Augue Velit Cursus Nunc,

Ответы [ 3 ]

2 голосов
/ 14 апреля 2011

Это не отвечает на ваш конкретный вопрос о регулярном выражении, но вы можете рассмотреть возможность использования модуля CPAN: Text :: Sentence . Вы можете посмотреть на его исходный код, чтобы увидеть, как оно определяет предложение.

use warnings;
use strict;
use Data::Dumper;
use Text::Sentence qw(split_sentences);

my $text = <<EOF;
One sentence.  Here is another.
And yet another.
EOF

my @sentences = split_sentences($text);
print Dumper(\@sentences);

__END__

$VAR1 = [
          'One sentence.',
          'Here is another.',
          'And yet another.'
        ];

Поиском в Google также показалось: Lingua :: EN :: Предложение

2 голосов
/ 14 апреля 2011

Я не знаю, что у вас в lorem.txt, но код, который вы дали, не считает предложения. Он считает строк , и более того, он считает строки, которые начинаются с заглавной буквы .

Это регулярное выражение:

/^[A-Z]/

будет соответствовать только в начале строки, и только если первый символ в этой строке будет написан заглавными буквами. Так что если у вас есть строка, которая выглядит как it. And then we went..., она будет не соответствовать.

Если вы хотите сопоставить все заглавные буквы, просто удалите ^ из начала регулярного выражения.

1 голос
/ 14 апреля 2011

В данный момент вы считаете все строки, которые начинаются с заглавной буквы. Возможно, вы собираетесь подсчитать все слова, начинающиеся с заглавной буквы? Если это так, попробуйте:

m/\W[A-Z]/

(хотя это не точное количество предложений)

С другой стороны, нет необходимости явно манипулировать файлами. Perl делает действительно хорошую работу для вас. Попробуйте это:


$ARGV[ 0 ] = "c:/programs/lorem.txt" unless @ARGV;
while( $line = <> ) {
...

Если вы настаиваете на явном открытии / закрытии, считается плохой практикой использовать необработанные дескрипторы файлов. Другими словами, вместо "open IN ...", сделайте "open my $ fh, '<', $ file_name;" </p>

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