Pregunta

Está bien, tengo una bastante sencilla (al menos parece simple). Tengo una cadena de múltiples alineados y yo estoy jugando con la sustitución de palabras diferentes con algo más. Te voy a enseñar ...

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

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

La salida sería
That is my Hat
Hats are very expensive...

El "sombrero" en la primera línea no debe ser capitalizada. ¿Hay trucos que pueden hacer que la carcasa compatible con la forma en que está escrito Inglés? Gracias:)

Otros consejos

Puede utilizar el modificador e a s/// para hacer el truco:

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

Por un lado, se debe utilizar \b (límite de palabra) para que coincida con solamente la palabra entera. Por ejemplo s/hat/coat/ cambiaría That a Tcoat sin conducir \b. Ahora, para su pregunta. Con la /e bandera se puede utilizar código Perl en la parte sustitución de la expresión regular. Así que usted puede escribir una función en Perl que comprueba el caso del partido y luego ponga el caso de la sustitución correctamente:

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

Las impresiones:

That is my hat.
Hats are very expensive.

Esto puede resolver su problema:


#!/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";
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top