如何将单引号字符串转换为双引号字符串,以便它被解释?
比如我有,如何将单引号字符串转换为双引号字符串,以便它被解释?
my $str = '\t';
print "My String is ".$str;
我想输出解释制表符,并返回类似:
"My String is \t"
我其实从数据库中获取的字符串值,并将其将其作为单引号字符串返回。
$ perl -MString::Interpolate=interpolate -E 'say "My String is [". interpolate(shift) . "]"' '\t'
My String is [ ]
'\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;
你可以跟随的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;
记住:Perlfaq是你的朋友(几乎和你一样!)。 – 2011-04-05 06:55:18
嗯,我只是尝试了下面的解决方法它的工作。请看看
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
单引号或双引号是源代码中发生的事情。数据库不会返回源代码,因此数据库无法“将其返回为单引号字符串”。你的数据库返回什么?由反斜杠和“t”组成的双字符字符串?或者它返回一个由制表符组成的单字符字符串? – tadmc 2011-04-05 02:20:50