Frage

Okay, habe ich eine ziemlich einfache (zumindest scheint einfach). Ich habe einen Multi-String gefüttert und ich bin gerade mit dem Ersetzen verschiedene Worte mit etwas anderem herumspielen. Lassen Sie mich Ihnen ...

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

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

Der Ausgang wäre
That is my Hat
Hats are very expensive...

Der „Hut“ auf der ersten Zeile nicht aktiviert werden soll. Gibt es irgendwelche Tricks, die das Gehäuse kompatibel mit wie Englisch geschrieben machen? Danke:)

Andere Tipps

Sie können den e Modifikator s/// verwenden den Trick zu tun:

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

Zum einen sollten Sie \b (Wortgrenze) nur das ganze Wort entsprechen. s/hat/coat/ würde That zum Beispiel ohne führenden Tcoat zu \b ändern. Nun zu Ihrer Frage. Mit der Flagge /e können Sie Perl-Code in dem Ersatzteil des Regex verwenden. So haben Sie eine Perl-Funktion schreiben kann, dass die Kontrollen der Fall des Spiels und dann den Fall des Ersatz richtig eingestellt:

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;
        }
}

Prints:

That is my hat.
Hats are very expensive.

Dies kann Ihr Problem lösen:


#!/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";
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top