如何在特定位置删除字符串中的字符?

4

我有变量$pos$toRemove$line。我想从字符串$line的位置$pos删除$toRemove

$line = "Hello kitty how are you kitty kitty nice kitty";
$toRemove = "kitty";
$pos = 30; # the 3rd 'kitty'

我想检查从第30个位置开始是否有字符串kitty,并且我想确切地删除它。
你能给我一个解决方案吗?我可以使用很多循环和变量来完成,但看起来很奇怪,而且运行速度非常慢。
5个回答

6
if (substr($line, $pos, length($toRemove)) eq $toRemove) {
    substr($line, $pos, length($toRemove)) = "";
}

3
$line = "Hello kitty how are you kitty kitty nice kitty";
$toRemove = "kitty";
$pos = 30; # the 3rd 'kitty'

pos($line) = $pos;
$line =~ s/\G$toRemove//gc;
print $line;

输出:

Hello kitty how are you kitty  nice kitty

2
另一种方式:
$line = "Hello kitty how are you kitty kitty nice kitty";
$toRemove = "kitty";
$pos = 30;

$line =~ s/(.{$pos})$toRemove/$1/;
print $line;

结果:

Hello kitty how are you kitty  nice kitty

2
$line =~ s/^.{30}\K$toRemove//;

这里使用了向后查找断言来匹配前30个字符,但不包括它们在被替换的模式部分中。


1

[pos] 操作符是一个左值,专门用于这种情况:

[pos]:

use strict;
use warnings;

my $line = "Hello kitty how are you kitty kitty nice kitty";
my $toRemove = "kitty";
my $pos = 30;

pos($line) = $pos;

$line =~ s/\G$toRemove//;

print $line;

输出

Hello kitty how are you kitty  nice kitty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接