Странное поведение '\' под mod_perl - PullRequest
0 голосов
/ 02 июня 2010

У меня есть следующее в сценарии, который работает под mod_perl

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

Что выводит следующее в мой файл журнала:

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

$ 1 известно как ноль. Это ошибка в mod_perl2 или мне чего-то не хватает?

Ответы [ 2 ]

2 голосов
/ 02 июня 2010

Вы пробовали:

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

или, чтобы избежать предупреждений:

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

Идея в том, что q! ...! не интерполирует его содержимое, так что вы точно знаете, что первая часть строки будет $ 1 = ". Если она все еще не появляется в выходных данных, то вы знаете, что Logger :: log () или что-то, что он вызывает, интерполирует свои аргументы что, вероятно, не должно происходить.

О, и если вы используете более современный Perl, во втором примере вместо этого можно использовать ($ 1 // '').

1 голос
/ 02 июня 2010

Если вас беспокоит перехват и случайная печать нулей, есть быстрый и простой способ, который почти все порекомендуют вам сначала: добавьте в свою программу следующее:

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'";  
...