2009-07-01 9 views
9

Was ist der Unterschied von \ 1 im Gegensatz zu $ ​​1 wenn überhaupt, oder sind sie in allen Situationen austauschbar?

Beispiel:

s/([a-z]+),afklol/$1,bck/; 
#against 
s/([a-z]+),afklol/\1,bck/; 

Sie beide das gleiche Ergebnis, aber gibt es einen Unterschied?

Antwort

16

Gerade von perldoc perlre:

Warnung auf \ 1 vs $ 1

Einige Leute zu bekommen, um zu schreiben Dinge wie verwendet:

$pattern =~ s/(\W)/\\\1/g; 

Dies ist für die RHS einer grandfathered Ersatz, um zu vermeiden, schockieren die sed Süchtige, aber es ist eine schmutzige Angewohnheit zu bekommen in. Das liegt daran, dass in PerlThink die rechte Seite eines "s ///" eine doppelt zitierte Zeichenfolge ist. "\ 1" in der üblichen doppelt zitierten Zeichenfolge bedeutet eine Kontrolle-A. Die übliche Unix-Bedeutung von "\ 1" wird für "s ///" geklickt. Wenn Sie jedoch die Angewohnheit von dabei tun, bekommen Sie sich in Ärger, wenn Sie dann einen "/ e" Modifikator hinzufügen.

s/(\d+)/ \1 + 1 /eg;  # causes warning under -w 

Oder wenn Sie

s/(\d+)/\1000/; 

zu tun versuchen Sie nicht, dass Mehrdeutigkeiten von sagen: "{1} 000", während Sie es mit beheben können "$ {1} 000" . Die Operation der Interpolation sollte nicht verwechselt werden mit der Operation der Übereinstimmung einer Rückverweis.

Sicher meinen sie zwei verschiedene Dinge auf der linken Seite des "s ///".

1

Sie geben das gleiche Ergebnis, aber $ 1 behält seinen Wert, während \ 1 nicht. Versuchen Sie folgendes:

s/([a-z]+),afklol/$1,bck/; 
print "\$1 is $1\n"; 
#against 
s/([a-z]+),afklol/\1,bck/; 
print "\\1 is \1\n"; 
+1

Das liegt daran, dass außerhalb von einem m // oder s /// \ 1 keine Rückverweisung ist. (Was es tatsächlich ist, hängt vom Kontext ab.) –

9

nur ich \1 bei den seltenen Gelegenheiten nutzen, wo ich das Spiel benötigen eine Wiederholung eines früheren Teil des Musters umfassen. z.B.

/(foo|bar)baz\1/ 

Dies würde "foobazfoo" oder "barbazbar" entsprechen, aber nicht "foobazbar". Sie kann nicht verwenden $1 dort.

In allen anderen Fällen verwende ich $1 und Kin, weil es zu viele Fehler gibt, die andere Notation zu verwenden. Siehe perlre für alle blutigen Details.

+1

Das habe ich mich gefragt, als ich die Frage sah: Können beide für die Rückreferenz verwendet werden? – Axeman