2009-12-15 10 views
6

Ich möchte so etwas wie dies zu tun:Perl: Kann ich Rückverweise (nicht ihre Werte) in Variablen speichern?

my $text = "The owls are not what they seem."; 
my $pattern = '(\s+)'; 
my $replacement = '-$1-'; 
$text =~ s/$pattern/$replacement/g; 

Text $ sollte dann: The- -owls- -are- -not- -what- -they- -seem.

Aber natürlich ist es mehr wie: The- $ 1-Eulen-$ 1-sind- $ 1-nicht- $ 1-was- $ 1-sie-$ 1-scheinen.

Ich habe versucht, alle Arten von Rückwärtsreferenzen ($ 1, \ 1, \ g {1}, \ g1) und sie alle nicht arbeiten. Der Modifikator/e hat auch nicht funktioniert. Ist das überhaupt möglich?

Der Zweck ist, einen Text innerhalb eines Objekts mit einer Zeile wie folgt zu ändern: $ object-> ersetzen ('() oo.', '$ 1ar')

Jede andere Ideen, wie dies könnte erledigt?

Vielen Dank.

+0

qr/(\ s +)/ist besser als '(\ s +)' –

Antwort

12

könnten Sie eval und dann Strings erweitern /ee mit:

my $text = "The owls are not what they seem."; 
my $pattern = '(\s+)'; 
my $replacement = q{"-$1-"}; 
$text =~ s/$pattern/$replacement/eeg; 

Von perldoc perlop:

e die rechte Seite als Ausdruck auswerten.

ee Evaluieren die rechte Seite als String dann

jedoch das Ergebnis eval, würde ich mit sicherer fühlen

my $replacement = sub { "-$1-" }; 
$text =~ s/$pattern/$replacement->()/eg; 

Aber es hängt alles von dem Kontext, in dem Sie dies tun.

+0

ee = Eval dann Variablen erweitern. –

+2

Ich hätte an das Sub denken können. Es ist jetzt so offensichtlich. Und es passt perfekt. Vielen Dank! – wuwuwu

-3

$ text = ~ s/$ Muster/- $ 1-/g;

+0

Nein, ich kann den '- $ 1-' Teil nicht direkt wie zur Verfügung stellen Dies. Es ist in einer Variablen: $ ersatz = '- $ 1-'; $ text = ~ s/$ muster/$ ersatz/g; – wuwuwu

3

Sinan Ünürs Lösung wird funktionieren, aber es erfordert immer noch, dass die Ersetzungszeichenfolge ein Literal innerhalb des Programms ist. Wenn das Ersatzzeichenfolge von Daten kommt, werden Sie etwas ein wenig schicker zu tun haben:

sub dyn_replace { 
    my ($replace) = @_; 
    my @groups; 
    { 
    no strict 'refs'; 
    $groups[$_] = $$_ for 1 .. $#-;  # the size of @- tells us the number of capturing groups 
    } 
    $replace =~ s/\$(\d+)/$groups[$1]/g; 
    return $replace; 
} 

und dann verwenden, wie

$text =~ s/$pattern/dyn_replace($replacement)/eg; 

Beachten Sie, dass dies vermeidet auch eval und ermöglicht die Verwendung von Modifikatoren wie/g. Code genommen von this Perl Monks node aber ich schrieb diesen Knoten, also ist es okay :)

+0

So weit ich das verstehe, ist es irgendwie dasselbe wie Sinan Ünürs Subref-Lösung, außer dass es viel komplizierter ist. – wuwuwu

+2

Die Lösung von Sinan erfordert, dass $ replacement eine literale Zeichenfolge innerhalb der Subref ist. Mine erlaubt, dass es ein beliebiger Stringwert ist. – Dan

Verwandte Themen