2013-11-20 1 views
5

Fondamentalmente io voglio fare questo:Come differire la sostituzione per accedere a var dalla ricerca?

#!/usr/bin/perl 
$search = qr/(?<X>abc)/; 
$_ = "123 abc 456"; 
s/$search/$+{X} $+{X}/; 
print; 

qualcosa di simile:

#!/usr/bin/perl 
$search = qr/(?<X>abc)/; 
$replace = q($+{X} $+{X}); 
$_ = "123 abc 456"; 
s/$search/$replace/; 
print; 

risultato dovrebbe essere 123 abc abc 456.

È possibile?

$replace deve essere mantenuto come var esterno. Quindi, non voglio che il contenuto sia stato spostato in un'altra posizione. Sto leggendo queste informazioni da un file.

risposta

3

Prova con una funzione di un add una bandiera per valutare la parte di ricambio, come questo:

#!/usr/bin/env perl 

$search = qr/(?<X>abc)/; 
$replace = sub { qq($+{X} $+{X}) }; 
$_ = "123 abc 456"; 
s/$search/$replace->()/e; 
print; 

produce:

123 abc abc 456 
+0

Inoltre, non posso avere il contenuto appena trasferita in un'altra posizione ho bisogno di spostare il contenuto ci – Adrian

4

capito. Ho bisogno di fare una doppia valutazione sull'espressione (grazie a @Birei per avermi indicato al comando regex valutare.Non riesco a trovarlo nei documenti perl anche se ... dovevo google. :()

Quindi diventa:..

#!/usr/bin/perl 
$search = qr/(?<X>abc)/; 
$replace = q(qq($+{X} $+{X})); 
$_ = "123 abc 456"; 
s/$search/$replace/ee; 
print; 
+3

* "Ancora non riesco a trovarlo nella documentazione perl anche se" * i Supponiamo che tu intenda 'ee'? Vedi' perldoc perlop' sotto 's/PATTERN/REPLACEMENT/msixpogce' – ThisSuitIsBlackNot

+0

Ah, non c'è da stupirsi, stava guardando nel' perlre'. Grazie – Adrian

+1

alcune bandiere influenzano la corrispondenza effettiva e sono in perlre; sono specifici per me m e sono documentati in perlop. per * perché * è preoccupato ks, vedi http://stackoverflow.com/a/392717/17389 – ysth