在Perl中逐个字符解析字符串

在Perl中逐个字符解析字符串,perl,Perl,我想逐个字符解析字符串。我正在使用perl来实现这一点。我们可以从字符串的第一个字符开始,然后逐个字符循环吗。现在我已经将字符串拆分为一个数组,我正在对数组进行loo[ping] $var="junk shit here. fkuc lkasjdfie."; @chars=split("",$var); 但是,除了先拆分整个字符串之外,是否有任何描述符可以指向字符串的第一个字符,然后遍历每个字符?有什么方法可以做到这一点吗?我不知道它是否比拆分它快,但你可以复制它和它,直到它为空 $a = "

我想逐个字符解析字符串。我正在使用perl来实现这一点。我们可以从字符串的第一个字符开始,然后逐个字符循环吗。现在我已经将字符串拆分为一个数组,我正在对数组进行loo[ping]

$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'
    ];