我在以mod_perl
运行的脚本中有以下内容Logger::log("\$1 = '$1'");
Logger::log("\$ 1 = '$1'");
Logger::log("\\$1 = '$1'");
将以下内容输出到我的日志文件中:
logger: = ''
logger: $ 1 = ''
logger: \ = ''
$ 1已知为null。这是mod_perl2中的一个错误还是我缺少的其他东西?
答案 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'";