我需要从文本中获取前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; }
}
这很好但我担心代码的效率。
想象一下,我为很多很多文本做了同样的事情。 应该有更聪明更美好的方式,但我无法理解。
提前致谢。
答案 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;
更新:删除了错误的解决方案。