0

我在 mod_perl 下运行的脚本中有以下内容

Logger::log("\$1 = '$1'");
Logger::log("\$ 1 = '$1'");
Logger::log("\\$1 = '$1'");

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

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

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

4

2 回答 2

2

你试过了吗:

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

或者,为了避免警告:

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

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

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

于 2010-06-02T01:33:26.473 回答
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'";  
于 2010-06-01T22:12:59.500 回答