2013-04-23 123 views
-1

在Perl中是否有一種方法來保存和打印字符串變量中的所有反斜槓? 例如:在Perl字符串中保留反斜槓

$str = 'a\\b'; 

輸出是

a\b 

,但我需要

a\\b 

的問題是不能以任何方式處理字符串逃避,因爲我 反斜槓必須從數據庫中讀取複雜的正則表達式,並且不知道它們出現在哪個組合和編號中,並且必須完全按照它們在Web上打印它們頁。

我試着用模板工具包和html和html_entity過濾器。它的工作原理迄今爲止唯一的方法是使用一個單一這裏引用文件:

print <<'XYZ'; 
a\\b 
XYZ 

但我不能插值的變量,這使得該解決方案毫無用處。

我試圖寫一個字符串到網頁,文件和殼,但沒有運氣,總是一個反斜槓消失。也許我完全在錯誤的軌道上,但什麼是正確的方式來打印複雜的正則表達式,包括所有組合和數字中的反斜槓,而沒有任何更改?

換句話說: 我有一個數據庫包含數百個正則表達式作爲字符串數據。我想用Perl讀取它們,並將它們精確地打印在網頁上,就像它們在數據庫中一樣。 許多管理員都對這些正則表達式有所改變,所以我不知道如何以及如何逃避。 一個典型的例子是這樣的: 'C:\\test\\file \S+' ,但它可能會改變第二天 '\S+ C:\\test\\file' 也許一個正確的結論是準確逃脫每反斜線一次在組合中,無論它出現?這意味着它可以將它們加倍。那麼問題就沒有我擔心的那麼大了。我在bash上測試了它,它連續運行了兩個甚至三個反斜槓(4個backslaches打印2個反斜槓和3個反斜槓)。

+5

請舉例說明你想做什麼。一旦反斜槓在變量中,它們將保持不變,並且如果它們插入到字符串中,它們將正確顯示。將一對反斜槓放入字符串*的唯一方法是將它們加倍,但這不應該成爲問題。有幾個軟件層將反斜槓視爲轉義字符,因此您的問題可能不在Perl內。 – Borodin 2013-04-23 12:09:47

回答

2
my $str = 'a\\b'; 
print $str; 

這打印a\\b

使用 my $ str ='a \\ b'; 改爲

0

這是一個PITA,但您只需要將反斜槓加倍即可

a\\\\b 

否則,您可以將反斜槓存儲在另一個變量中,然後對其進行插值。

1

最小得到兩條斜線是(不幸)三個斜槓:

use 5.016; 
my $a = 'a\\\b'; 
say $a; 
0

您可以使用下面的正則表達式來正確地形成的字符串:

my $str = 'a\\b'; 
$str =~ s/\\/\\\\/g; 
print "$str\n"; 

這將打印a\\b

編輯:

您可以使用插值來代替:

my $str = <<'EOF'; 
a\\b 
EOF 
print "$str\n"; 

這仍然打印a\\b

+1

謝謝,但只適用於你在字符串中加了反斜槓的情況。如果你有一個額外的單反斜槓,它會在輸出中翻倍。 – Norbert 2013-04-23 12:53:14

+0

確實,確實...... – 2013-04-23 14:16:51

1

當在Perl源代碼,例如它發生反斜槓只有意義的Perl:你的文字字符串賦值給一個變量:

my $str = 'a\\b'; 

但是,如果從文件中讀取數據(或數據庫或套接字等),您讀取的數據中的任何反斜槓都將被保留,而無需採取任何特殊步驟。

+1

是的,確切地說。有時候明顯的事情需要時間來理解。現在一切都很清楚。謝謝。 – Norbert 2013-04-24 09:45:07

1

我試圖解決的問題不存在。我混淆了使用html表單直接在代碼中初始化字符串。在保存所有反斜槓的代碼中使用字符串只能通過here文檔或讀取包含字符串的文本文件。但是,如果我只是使用網頁上的html表單來插入一個字符串,並使用CGI模塊中的escapeHTML()函數,它將處理所有內容,並且可以插入特殊字符的最多有線組合。它們都按照插入的方式顯示和保存。所以我應該直接開始使用html和數據庫操作,而不是直接在代碼中使用字符串來嘗試首先檢查事物 。無論如何,感謝您的幫助。