0

mod_perlで実行されるスクリプトには次のものがあります

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

ログファイルに次を出力します。

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

$1 は null であることがわかっています。これは 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を使用しているなら、2番目の例は代わりに($ 1 //'')を使うことができます。

于 2010-06-02T01:33:26.473 に答える
1

ヌルをキャッチして誤って出力することが心配な場合は、ほとんどの人が最初に実行することをお勧めする、すばやく簡単な方法があります。プログラムに次を追加します。

use strict;
use warnings;

特に問題は奇妙に思えます。私がする時

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

私は得る

$1: ''

(そして use strict と warnings を使用すると、追加のエラー

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

もちろん、正規表現をテストすれば、$1 が null になるのを防ぐことができます。

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

そうです、ロガーが $1 を別のものとして再解釈している可能性があります。さらに 2 つ追加してみてください\\。1 つは $ をエスケープするためのもので、もう 1 つは余分なバックスラッシュをエスケープするためのものです。したがって、次のようになります

print "\\\$1: '$1'";  
于 2010-06-01T22:12:59.500 に答える