2010-06-01 3 views
0

je suit dans un script qui fonctionne sous mod_perlComportement étrange de « » mod_perl

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

qui produit les éléments suivants dans mon fichier journal:

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

1 $ est connu pour être nul. Est-ce un bug dans mod_perl2 ou est-ce autre chose qui me manque?

+1

Quelle sortie espériez-vous obtenir? – crazyscot

+0

La méthode 'Logger :: log' fait-elle une interpolation sur son entrée? D'où vient la méthode' Logger :: log', de toute façon? – mob

+0

La sortie que j'espérais obtenir était "$ 1 = ''". est personnalisé et la ligne qui sort vers le fichier journal ressemble à: print LOG "$ date: $ msg \ n "; Donc il fait sa propre interpolation de la chaîne plus tard. Cela pourrait-il être ce qui le fait? – shiftycow

Répondre

2

Avez-vous essayé:

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

ou, pour éviter les avertissements:

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

L'idée est ici que q ...! n'interpole pas son contenu, donc vous savez avec certitude que la première partie de la chaîne sera $ 1 = ".S'il n'apparaît toujours pas dans la sortie, alors vous connaissez Logger :: log() ou quelque chose qu'il appelle interpole ses arguments , ce qui ne devrait probablement pas se produire.

Oh, et si vous utilisez un Perl plus moderne, le second exemple peut utiliser (1 $ // « ») à la place.

1

Si vous êtes inquiet au sujet de capture et d'impression par mégarde nulls, il y a un moyen rapide et facile que presque tout le monde vous recommande faire en premier: ajouter ce qui suit à votre programme:

use strict; 
use warnings; 

Le problème en particulier semble impair; quand je fais

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

Je reçois

$1: '' 

(et avec une utilisation stricte et des avertissements, l'erreur supplémentaire

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

Bien sûr, vous pouvez empêcher 1 $ de jamais être nulle si vous Testez votre regex:

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

Alors oui, il se peut que votre enregistreur ré-interprète $ 1 comme autre chose. Essayez d'ajouter deux autres \\; un pour échapper le $, et un autre pour échapper une barre oblique inverse supplémentaire. Ainsi, il avait l'air d'

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

L'ajout des deux "\\" supplémentaires réussit à éviter le $ 1, mais il ajoute un autre "\" à la sortie, de sorte qu'il ressemble à "Tue Jun 1 16:21:31 MDT 2010: \ $ 1 = ''". Ce qui est encore assez étrange pour moi, mais assez bon pour le débogage. – shiftycow