4

変数、、$pos$toRemoveあり$lineます。$toRemoveこの文字列から位置から削除したいと思い$posます。

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

30の位置から文字列があるかどうかを確認しkittyたいので、これを正確に削除したいと思います。

その解決策を教えていただけますか?たくさんのループと変数を使ってそれを行うことができますが、それは奇妙に見え、本当に遅く動作します。

4

5 に答える 5

6
if (substr($line, $pos, length($toRemove)) eq $toRemove) {
    substr($line, $pos, length($toRemove)) = "";
}
于 2012-08-10T09:20:32.510 に答える
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
于 2012-08-10T09:21:55.553 に答える
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
于 2012-08-10T09:25:22.523 に答える
2
$line =~ s/^.{30}\K$toRemove//;

これは、後読みアサーションを使用して、置き換えられるパターンの部分にそれらを含めずに、最初の30文字を照合します。

于 2012-08-10T10:14:25.627 に答える
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
于 2012-08-12T02:40:01.933 に答える