为什么Perl调试器在字符串中转义单引号?

时间:2017-03-09 10:08:36

标签: perl

我有以下变量:

my $search_sql = "select COUNT(*) as COUNT
                  FROM $this->{KB_OBJECT_PORTFOLIOS} K
                  WHERE K.TARGET_ID=$target_id
                  AND K.TARGET_SERVICE_ID=$target_service_id
                  and K.PARSE_PARAM='$parse_param'
                  and K.THRESHOLD='$threshold'
                  and K.`STATUS`='WITHDRAWN';"

当我在调试器中打印时,我得到:

select COUNT(*) ... and K.PARSE_PARAM=\'bkey=9781580536998\' and ...

但我希望得到:

select COUNT(*) ... and K.PARSE_PARAM='bkey=9781580536998' and ...

我怎样才能解读单引号?

3 个答案:

答案 0 :(得分:3)

这就是Perl调试器显示字符串的方式。它总是在单引号中显示字符串 - 因此字符串中的任何单引号都需要转义。

但这只是一个显示问题。你的实际字符串没有改变,应该可以正常工作。

我怀疑你猜测是什么导致了你遇到的一些问题。但你猜错了。我认为你需要回到一个级别并解释你想要解决的实际问题。把它放在一个新问题中。

答案 1 :(得分:3)

您的问题的答案是Perl 随机转义字符串中的字符,只是调试器添加反斜杠以消除其显示的字符串歧义。无论你追逐什么问题都在其他地方

您应该在SQL字符串中使用占位符,并在调用$sth->execute()

时提供实际参数

当它的表名前面没有引用任何类型的列名时,所以k.status没问题

看起来像这样

my $search_sql = sprintf <<__END_SQL__, $dbh->quote_identfier($this->{KB_OBJECT_PORTFOLIOS});
SELECT COUNT(*) AS count
FROM %s AS k
WHERE k.target_id         = ?,
AND   k.target_service_id = ?,
AND   k.parse_param       = ?,
AND   k.threshold         = ?,
AND   k.status            = ?
__END_SQL__

my $sth = $dbh->prepare($search_sql);

$sth->execute($target_id, $target_service_id, $parse_param, $threshold, 'WITHDRAWN');

答案 2 :(得分:-3)

我想我通过使用

找到了答案
<<EOF;

符号