如何使用perl从文本中有效地获取大量单词?

时间:2011-03-27 16:01:14

标签: perl

我需要从文本中获取前50个单词,以便向我的应用程序的用户提供exerpt。 我做了以下事情:

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 个答案:

答案 0 :(得分:4)

如果将“单词”定义为“\ S”,则可以执行以下操作:

$words = $1 if $text=~/^\s*((?:\S+(?:\s+|$)){0,50})/;

答案 1 :(得分:3)

尝试:

#!/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";

答案 2 :(得分:3)

你可以得到所有的话,然后删除多余的,如shawnhcorey的解决方案,或者你可以在你有足够的时候停止。

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

更新:删除了错误的解决方案。