質問

さて、私はかなり簡単なものを手に入れました(少なくとも単純に思えます)。私は多糸の文字列を持っています、そして、私は異なる単語を何か他のものに置き換えることで遊んでいるだけです。披露させて...

#!/usr/bin/perl -w
use strict;

$_ = "That is my coat.\nCoats are very expensive.";
s/coat/Hat/igm;
print;

出力はそうでしょう
That is my Hat
Hats are very expensive...

最初の行の「帽子」を大文字にするべきではありません。英語の書かれた方法でケーシングを順守することができるトリックはありますか?ありがとう :)

他のヒント

使用できます e 修飾子へ s/// トリックをするために:

s/(coat)/ucfirst($1) eq $1 ? 'Hat' : 'hat'/igme;

1つは使用する必要があります \b (単語の境界)単語全体のみに一致する。例えば s/hat/coat/ 変化するであろう ThatTcoat リードなし \b. 。今あなたの質問のために。旗で /e Regexの代替部分でPerlコードを使用できます。したがって、試合のケースをチェックするPERL関数を記述してから、交換のケースを適切に設定できます。

my $s = "That is my coat.\nCoats are very expensive.";
$s =~ s/(\bcoat)/&same_case($1, "hat")/igme;
print $s, "\n";

sub same_case {
        my ($match, $replacement) = @_;

        # if match starts with uppercase character, apply ucfirst to replacement
        if($match =~ /^[A-Z]/) {
                return ucfirst($replacement);
        }
        else {
                return $replacement;
        }
}

印刷:

That is my hat.
Hats are very expensive.

これはあなたの問題を解決するかもしれません:


#!/usr/bin/perl -w

use strict;

sub smartSubstitute {
    my $target = shift;
    my $pattern = shift;
    my $replacement = shift;

    $pattern = ucfirst $pattern;
    $replacement = ucfirst $replacement;

    $target =~ s/$pattern/$replacement/gm;

    $pattern = lcfirst $pattern;
    $replacement = lcfirst $replacement;

    $target =~ s/$pattern/$replacement/gm;

    return $target;
}

my $x = "That is my coat.\nCoats are very expansive.";
my $y = smartSubstitute($x, "coat", "Hat");
print $y, "\n";
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top