2016-12-20 44 views

回答

2

使用q存儲字符和使用quotemeta逃脫所有的字符

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

print $myVar; 

或者使用正則表達式替換逃避所有的字符

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

$ var = q($ var); $ var = quotemeta($ var);在這裏它也在$ var中轉義$,所以它不能替換$ var的值? –

+0

@PradnyaDeshmukh改爲使用'qq($ var);' – mkHun

+0

Worked quotemeta()for me –

4

這是什麼quotemeta是爲了,如果我明白你的任務。來自鏈接的文檔

返回EXPR的值,所有非「字」字符都是反斜槓。 (也就是說,不論區域設置如何,所有不匹配/[A-Za-z_0-9]/的字符都將在返回的字符串中加上反斜槓。)這是在雙引號字符串中實現\Q轉義的內部函數。

它的使用非常簡單

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

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

請注意,我們必須手動逃脫的最後一個反斜槓,以防止它逃跑的結束分隔符。或者你可以在最後加上一個額外的空間,然後去掉它(由chop)。

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

現在變換$myVar像上面,使用quotemeta

我把外部的一對"僅僅表示你想要的變量。但是,如果它們實際上是在變量中,那麼只需將其全部放入q(),因爲最後一個字符是"。唯一的問題是緊接在結束分隔符之前的反斜線。

如果你需要在正則表達式中使用這個,那麼你使用\Q開始,\E結束轉義。

-1

Giving Thanks to

\ Q之間有什麼和\ E被視爲正常的字符,而不是正則表達式的字符。例如,

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

它不會停止插值變量。

$search = '.'; 
'.' =~ /$search/;  # match 
'a' =~ /$search/;  # match 
'.' =~ /\Q$search\E/; # match 
'a' =~ /\Q$search\E/; # no match 
相關問題