0

さて、私はかなり単純なものを手に入れました(少なくとも単純に見えます)。複数行の文字列があり、さまざまな単語を別のものに置き換えて遊んでいます。披露させて...

#!/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...

最初の行の「帽子」は大文字にしないでください。ケーシングを英語の書き方に準拠させるためのトリックはありますか? ありがとう :)

4

4 に答える 4

4

e修飾子を使用s///してトリックを実行できます。

s/(coat)/ucfirst($1) eq $1 ? 'Hat' : 'hat'/igme;
于 2010-08-12T07:56:37.497 に答える
1

1 つには、\b(単語境界) を使用して、単語全体のみに一致させる必要があります。たとえば、先頭なしs/hat/coat/に変更Thatされます。それでは質問です。フラグを使用すると、正規表現の置換部分で Perl コードを使用できます。したがって、一致の大文字と小文字をチェックし、置換の大文字と小文字を適切に設定する Perl 関数を作成できます。Tcoat\b/e

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.
于 2010-08-12T07:56:20.643 に答える
0

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


#!/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";
于 2010-08-12T08:16:06.997 に答える