2012-08-10 89 views
4

我有变量$pos,$toRemove$line。我想从$pos位置删除此字符串$toRemove如何从某个位置的字符串中删除字符?

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

我要检查,如果从30位有串kitty,我想正是删除此一个。

你能给我一个解决方案吗?我可以使用大量的循环和变量,但它看起来很奇怪,而且工作非常慢。

回答

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

Perl中,你可以多年后仍然学习有趣的语法... – naden 2012-08-10 10:00:26

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]运营商是一个左值只是这样的事情:

[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