如何从Perl中的字符串中删除特定字符?

时间:2010-10-25 10:35:29

标签: regex perl string replace

我正在尝试从Perl中的字符串中删除特定字符:

my $string="MATTHATBAT";
substr($string, 2, 1, ''); 
编辑:这确实有效,对不起。将此留在这里以防万一有人需要知道如何做到这一点。

此外,还有更有效的方法吗?

字符串现在应该是MATHATBAT。

我错过了什么吗?我知道我可以使用正则表达式///,但我正在迭代字符串,查找某个字符(此字符更改),然后删除该字符(但只删除该偏移处的字符)。所以最终,我将删除角色的第二次或第三次出现(即MATTHABAT,MATTHATBA甚至MATHABAT等)

我可以使用搜索和替换来执行此操作吗?我正在使用for循环来迭代偏移量。

3 个答案:

答案 0 :(得分:2)

以下是比较regexp与substr:

的基准
#!/usr/bin/perl 
use 5.10.1;
use warnings;
use strict;
use Benchmark qw(:all);

my $count = -3;
my $r = cmpthese($count,
  {
    'substring' => sub {
        my $string = "MATTHATBAT";
        substr($string, 2, 1, ''); 
    },
    'regexp' => sub {
        my $string = "MATTHATBAT";
        $string =~ s/(.{2})./$1/;
    },
  }
);

结果:

               Rate    regexp substring
regexp     162340/s        --      -93%
substring 2206122/s     1259%        --

如您所见,substr的速度是正则表达式的13.5倍。

@SinanÜnür1259%是13.5倍而不是12.5倍。

答案 1 :(得分:1)

您的示例确实有效。 $string将包含您想要的MATHATBAT,问题出在其他地方,而不是此部分。

答案 2 :(得分:0)

您可以使用// g

循环reg.exp匹配

来自perlrequick

   $x = "cat dog house"; # 3 words
   while ($x =~ /(\w+)/g) {
       print "Word is $1, ends at position ", pos $x, "\n";
   }

认为你可以在迭代时修改$ x ..或者你可以将pos $ x存储在一个数组中然后删除