2016-12-20 2 views

Antwort

2

Verwenden q die Zeichen zu speichern und die quotemeta verwenden alle Zeichen

my $myVar=q("this#@#!~`%^&*()[]}{;'".,<>?/\"); 
$myVar = quotemeta($myVar); 

print $myVar; 

Oder verwenden regex Substitution zu entkommen alle Zeichen

my $myVar=q("this#@#!~`%^&*()[]}{;'".,<>?/\"); 
$myVar =~s/(\W)/\\$1/g; 
print $myVar; 
+0

$ var = q ($ var); $ var = quotemeta ($ var); In diesem entkommt auch $ in '$ var', so dass der Wert von $ var nicht ersetzt wird. –

+0

@PradnyaDeshmukh Stattdessen verwenden Sie 'qq ($ var);' – mkHun

+0

Arbeitete quotemeta() für mich –

4

Dies ist, was quotemeta ist, wenn ich Ihre Suche verstehe. Von verknüpften Dokumenten

Gibt den Wert von EXPR zurück, wenn alle nicht "Wort" -Zeichen rückgestrichen sind. (Das bedeutet, dass allen Zeichen, die nicht mit /[A-Za-z_0-9]/ übereinstimmen, ein Backslash in der zurückgegebenen Zeichenfolge vorangestellt wird, unabhängig von den Gebietsschemaeinstellungen.) Dies ist die interne Funktion, die das \Q Escape in Strings mit doppelten Anführungszeichen implementiert.

Seine Verwendung ist sehr einfach

my $myVar = q(this#@#!~`%^&*()[]}{;'".,<>?/\\); 
print "$myVar\n"; 

my $quoted_var = quotemeta $myVar; 
print "$quoted_var\n"; 

Bitte beachte, dass wir müssen manuell den letzten Backslash , es zu verhindern, dass die Endbegrenzer zu entkommen. Oder Sie können am Ende ein zusätzliches Leerzeichen anbringen und dann abziehen (von chop).

my $myVar = q(this#@#!~`%^&*()[]}{;'".,<>?/\); 
chop $myVar; 

Jetzt $myVar wie oben verwandeln, quotemeta verwenden.

Ich nehme das äußere Paar von ", um nur anzugeben, was Sie in der Variable möchten. Aber wenn sie tatsächlich in der Variable enthalten sein sollen, dann setzen Sie einfach alles in q(), denn dann ist das letzte Zeichen ". Das einzige Problem ist ein umgekehrter Schrägstrich unmittelbar vor dem schließenden Begrenzer.

Wenn Sie dies in einem Regex-Kontext benötigen, verwenden Sie \Q zum Starten und \E, um zu beenden.

-1

Giving Thanks to:

Was ist zwischen \ Q und \ E als normale Zeichen behandelt wird, nicht regexp Zeichen. Beispiel:

'.' =~ /./;  # match 
'a' =~ /./;  # match 
'.' =~ /\Q.\E/; # match 
'a' =~ /\Q.\E/; # no match 

Es verhindert nicht, dass Variablen interpoliert werden.

$search = '.'; 
'.' =~ /$search/;  # match 
'a' =~ /$search/;  # match 
'.' =~ /\Q$search\E/; # match 
'a' =~ /\Q$search\E/; # no match 
Verwandte Themen