mod_perl下'\'的奇怪行为

时间:2010-06-01 21:01:24

标签: perl mod-perl mod-perl2

我在以mod_perl

运行的脚本中有以下内容
Logger::log("\$1 = '$1'");
Logger::log("\$ 1 = '$1'");
Logger::log("\\$1 = '$1'");

将以下内容输出到我的日志文件中:

logger:  = ''
logger: $ 1 = ''
logger: \ = ''

$ 1已知为null。这是mod_perl2中的一个错误还是我缺少的其他东西?

2 个答案:

答案 0 :(得分:2)

你有没有尝试过:

Logger::log(q!$1 = '! . $1 . q!'!);

或者,为了避免警告:

Logger::log(q!$1 = '! . ( defined $1 ? $1 : '' ) . q!'!);

这里的想法是q!......!不插入其内容,所以你肯定知道字符串的第一部分将是$ 1 =“。如果它仍然没有出现在输出中,那么你知道Logger :: log()或它所调用的内容正在插入它的参数,这可能不应该发生。

哦,如果你使用的是更现代的Perl,第二个例子可以使用($ 1 //'')。

答案 1 :(得分:1)

如果你担心捕捉和意外打印空值,那么几乎每个人都会建议你先做一个快速简便的方法:将以下内容添加到你的程序中:

use strict;
use warnings;

这个问题特别奇怪;当我做的时候

my $foo = 'zip';
$foo =~ /(bal)/;
print "\$1: '$1'";

我得到了

$1: ''

(并使用严格和警告,附加错误

Use of uninitialized value in concatenation (.) or string at - line 5.

当然,如果你测试你的正则表达式,你可以防止$ 1为空:

if ($foo =~ /(pattern)/) {
    # $1 is guaranteed to be ok here, if it matched
}

所以,是的,你的记录器可能会重新解释1美元作为别的东西。尝试再添加两个\\;一个用于逃避$,另一个用于逃避额外的反斜杠。因此它看起来像

print "\\\$1: '$1'";