Как эффективно получить количество слов из текста, используя Perl? - PullRequest
1 голос
/ 27 марта 2011

Мне нужно получить первые ~ 50 слов из текста для подачи заявки пользователям моего приложения.Я сделал следующее:

use strict;use warnings;use utf8;
binmode(STDOUT, ':utf8');
my $text = <<TXT;
Регулярните изрази ни позволяват да търсим шаблони в данните си. 
Повечето букви и символи просто ще съвпадат със самите себе си. 
Например, регулярният израз "test" просто и точно ще съвпада със 
символния низ "test". Можете да включите режим, 
нечувствителен към разликата между малки и големи букви, който ще 
позволи да съвпадне също така и с "Test" или "TEST". Има изключения от 
това правило, някои символи са особени и не съвпадат със 
самите себе си. Вместо това те сигнализират... 
TXT

my $c = 0;
my $collected = substr($text, 0, 10);
while ($text =~ /$collected/) {
    $c += 10;
    $collected = substr($text, 0, $c);
    print $collected, $/;
    #sleep 1;
    my @words = split(/\s+/, $collected);

    if (@words >= 49) { last; }
}

это прекрасно работает, но я обеспокоен эффективностью кода.

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

Заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 27 марта 2011

Если вы определите «слово» как «\ S», вы можете сделать что-то вроде этого:

$words = $1 if $text=~/^\s*((?:\S+(?:\s+|$)){0,50})/;
3 голосов
/ 27 марта 2011

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

my @words;
push @words, $1 while @words < 50 && $text =~ /\s*(\S+)/g;

Обновление : удалено плохое решение.

3 голосов
/ 27 марта 2011

Попробуйте:

#!/usr/bin/env perl

use strict;
use warnings;

my $text = <<TXT;
Регулярните изрази ни позволяват да търсим шаблони в данните си. 
Повечето букви и символи просто ще съвпадат със самите себе си. 
Например, регулярният израз "test" просто и точно ще съвпада със 
символния низ "test". Можете да включите режим, 
нечувствителен към разликата между малки и големи букви, който ще 
позволи да съвпадне също така и с "Test" или "TEST". Има изключения от 
това правило, някои символи са особени и не съвпадат със 
самите себе си. Вместо това те сигнализират... 
TXT

my @words = $text =~ m/ \s* ( \S+ ) /gmsx;
$#words = 49;
print "@words\n";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...