Domanda

Va bene, ho un piuttosto semplice (almeno sembra semplice). Ho una stringa a più allineati e sto solo giocando intorno con la sostituzione parole diverse con qualcos'altro. Lasciate che vi mostri ...

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

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

L'uscita sarebbe
That is my Hat
Hats are very expensive...

Il "cappello" sulla prima linea non deve essere in maiuscolo. Ci sono dei trucchi che possono rendere il compliant involucro con il modo in inglese è stato scritto? Grazie:)

Altri suggerimenti

È possibile utilizzare il modificatore e a s/// di fare il trucco:

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

Per uno, si dovrebbe usare \b (limite di parola) per corrispondere solo l'intera parola. Per esempio s/hat/coat/ cambierebbe That a Tcoat senza portare \b. Ora per la tua domanda. Con il /e bandiera è possibile utilizzare il codice Perl nel pezzo di ricambio della regex. Così si può scrivere una funzione Perl che controlli il caso della partita e quindi impostare il caso di sostituzione correttamente:

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

Stampe:

That is my hat.
Hats are very expensive.

Questo potrebbe risolvere il 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";
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top