2011-04-04 72 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 
相关问题