2011-04-04 74 views
0

比如我有,如何將單引號字符串轉換爲雙引號字符串,以便它被解釋?

my $str = '\t'; 
print "My String is ".$str; 

我想輸出解釋製表符,並返回類似:

"My String is \t" 

我其實從數據庫中獲取的字符串值,並將其將其作爲單引號字符串返回。

+3

單引號或雙引號是源代碼中發生的事情。數據庫不會返回源代碼,因此數據庫無法「將其返回爲單引號字符串」。你的數據庫返回什麼?由反斜槓和「t」組成的雙字符字符串?或者它返回一個由製表符組成的單字符字符串? – tadmc 2011-04-05 02:20:50

回答

4

String::Interpolate正是如此

$ perl -MString::Interpolate=interpolate -E 'say "My String is [". interpolate(shift) . "]"' '\t' 
My String is [ ] 
4

'\t'"\t"字符串文字,的產生( 「\」, 「t」 和分別製表符)Perl代碼塊。數據庫不返回Perl代碼,所以用單引號文字和雙引號文字來描述問題是沒有意義的。你有一個字符串,句號。

該字符串由字符「\」和「t」組成。您想要將該字符序列轉換爲製表符。這是一個簡單的替代。

s/\\t/\t/g 

我想你不想只處理\t。您可以創建一個序列表。

my %escapes = (
    "t" => "\t", 
    "n" => "\n", 
    "\" => "\\", 
); 

my $escapes_pat = join('', map quotemeta, keys(%escapes)); 
$escapes_pat = qr/[$escapes_pat]/; 

s/\\($escapes_pat)/$escapes{$1}/g; 
4

你可以跟隨的perlfaq4答案技術How can I expand variables in text strings?


如果你能避免它,不這樣做,或者你可以使用一個模板系統,如文字: :模板或模板工具包,做這件事。你甚至可以把工作用的sprintf或printf的實現:

my $string = sprintf 'Say hello to %s and %s', $foo, $bar; 

但是,對於一次性簡單的情況下,我不希望拿出一個完整的模板系統,我將使用有兩個Perl標量變量的字符串。在這個例子中,我想擴大$ foo和$酒吧的變量的值:

my $foo = 'Fred'; 
my $bar = 'Barney'; 
$string = 'Say hello to $foo and $bar'; 

的一種方式,我可以做到這一點涉及到替代運營商和雙/ E標誌。第一個/ e評估替換端的$ 1,並將其變爲$ foo。第二個/ e以$ foo開頭並用它的值替換它。 $ foo的話,變成「弗雷德」,這是最後什麼字符串中左起:

$string =~ s/(\$\w+)/$1/eeg; # 'Say hello to Fred and Barney' 

的/ E也將忽略這些違規行爲的嚴格,用空字符串替換未定義的變量名。由於我使用了/ e標誌(甚至是兩次!),所以我在eval的字符串表單中遇到了同樣的安全問題。如果$ foo中存在某些奇怪的東西,可能類似於@ {[system「rm -rf /」]},那麼我可能會陷入麻煩。

爲了解決安全問題,我也可以從哈希中提取值而不是評估變量名稱。使用單個/ e,我可以檢查散列以確保值存在,如果不存在,我可以用標記替換缺失的值,在這種情況下?以表明我錯過了一些東西:

my $string = 'This has $foo and $bar'; 

my %Replacements = (
    foo => 'Fred', 
    ); 

# $string =~ s/\$(\w+)/$Replacements{$1}/g; 
$string =~ s/\$(\w+)/ 
    exists $Replacements{$1} ? $Replacements{$1} : '???' 
    /eg; 

print $string; 
+0

記住:Perlfaq是你的朋友(幾乎和你一樣!)。 – 2011-04-05 06:55:18

0

嗯,我只是嘗試了下面的解決方法它的工作。請看看

my $str1 = "1234\n\t5678"; 
print $str1; 
#it prints 
#1234 
#  5678 

$str1 =~ s/\t/\\t/g; 
$str1 =~ s/\n/\\n/g; 

print $str1; 
#it prints exactly the same 
#1234\n\t5678 
相關問題