在Perl中逐个字符解析字符串
我想逐个字符解析字符串。我正在使用perl来实现这一点。我们可以从字符串的第一个字符开始,然后逐个字符循环吗。现在我已经将字符串拆分为一个数组,我正在对数组进行loo[ping]在Perl中逐个字符解析字符串,perl,Perl,我想逐个字符解析字符串。我正在使用perl来实现这一点。我们可以从字符串的第一个字符开始,然后逐个字符循环吗。现在我已经将字符串拆分为一个数组,我正在对数组进行loo[ping] $var="junk shit here. fkuc lkasjdfie."; @chars=split("",$var); 但是,除了先拆分整个字符串之外,是否有任何描述符可以指向字符串的第一个字符,然后遍历每个字符?有什么方法可以做到这一点吗?我不知道它是否比拆分它快,但你可以复制它和它,直到它为空 $a = "
$var="junk shit here. fkuc lkasjdfie.";
@chars=split("",$var);
但是,除了先拆分整个字符串之外,是否有任何描述符可以指向字符串的第一个字符,然后遍历每个字符?有什么方法可以做到这一点吗?我不知道它是否比拆分它快,但你可以复制它和它,直到它为空
$a = "dude";
$b = reverse($a);
for ($i = length($b) ; $i>0 ; $i--) {
print chop $b; print "\n";'
}
或
当进行基准测试时,substr
方法的性能优于while
use Benchmark qw( cmpthese ) ;
my $var = "junk sit here. fkuc lkasjdfie." x1000;
cmpthese( -5, {
"while" => sub{
while ($var =~ /(.)/sg) {
my $char = $1;
# do something with $char
}
},
"substr" => sub{
for my $i (1 .. length $var) {
my $char = substr($var, $i-1, 1);
}
},
});
结果
Rate while substr
while 56.3/s -- -53%
substr 121/s 114% --
这可以是脚本/正则表达式的框架:
use strict;
use warnings;
use Data::Dumper qw(Dumper);
my $str = "The story of Dr. W. Fletcher who is a dentist. The hero of the community.";
my @sentences = split /(?<!(Dr| \w))\./, $str;
print Dumper \@sentences;
第一种方法是如何工作的?使用正则表达式会比第二种更快吗method@Ashwin检查以确定速度,Perl需要基准测试,通常有一种[更好的]方法来解决问题,而不必亲自遍历/解析字符串。你真正的目标是什么?@perreal:我的主要目标是拆分给定的字符串(一个大字符串)分为三个句子。使用“.”、“?”进行拆分。但是还有更多的限制,例如“W.Fletcher博士”不应该仅仅因为出现了3次“.”(句号)就拆分为3个句子。它仍然是一个单独的句子,您如何知道当前的。是一个表示句子结尾的句子还是一个句子的一部分?@Ashwin,听起来您可以使用带有环视断言的正则表达式拆分。@szabgab:这就是我试图解决的问题。一旦遇到句号,它必须与前面的字符匹配s以确定它们是否是首字母缩写、标题等“(?)?
Rate while substr
while 56.3/s -- -53%
substr 121/s 114% --
use strict;
use warnings;
use Data::Dumper qw(Dumper);
my $str = "The story of Dr. W. Fletcher who is a dentist. The hero of the community.";
my @sentences = split /(?<!(Dr| \w))\./, $str;
print Dumper \@sentences;
$VAR1 = [
'The story of Dr. W. Fletcher who is a dentist',
undef,
' The hero of the community'
];