我正在尝试从Perl中的字符串中删除特定字符:
my $string="MATTHATBAT";
substr($string, 2, 1, '');
编辑:这确实有效,对不起。将此留在这里以防万一有人需要知道如何做到这一点。
此外,还有更有效的方法吗?
字符串现在应该是MATHATBAT。
我错过了什么吗?我知道我可以使用正则表达式///,但我正在迭代字符串,查找某个字符(此字符更改),然后删除该字符(但只删除该偏移处的字符)。所以最终,我将删除角色的第二次或第三次出现(即MATTHABAT,MATTHATBA甚至MATHABAT等)
我可以使用搜索和替换来执行此操作吗?我正在使用for循环来迭代偏移量。
答案 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存储在一个数组中然后删除