Question

D'accord, je me suis un assez simple (au moins semble simple). J'ai une chaîne multi doublé et je suis en train de jouer avec le remplacement des mots différents avec autre chose. Laissez-moi vous montrer ...

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

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

La sortie serait
That is my Hat
Hats are very expensive...

Le « chapeau » sur la première ligne ne doit pas être capitalisé. Y a-t-il des trucs qui peuvent faire la conformité du boîtier avec la façon dont l'anglais est écrit? Merci:)

Autres conseils

Vous pouvez utiliser le modificateur de e à s/// faire l'affaire:

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

Pour un, vous devez utiliser \b (limite de mot) pour correspondre uniquement le mot entier. Par exemple s/hat/coat/ changerait That à Tcoat sans entraîner \b. Maintenant, pour votre question. Avec le drapeau /e vous pouvez utiliser le code Perl dans la pièce de rechange de la regex. Ainsi, vous pouvez écrire une fonction Perl qui vérifie le cas du match, puis régler le cas du remplacement correctement:

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.

Cela peut résoudre votre problème:


#!/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";
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top