2010-07-28 6 views
4

Je suis mordu par ce petit comportement de débogueur incohérent. La fonction quotemeta() semble se comporter différemment quand invoquer sous perl -dPourquoi la fonction quotemeta() de Perl se comporte-t-elle différemment sous le débogueur?

$ perl -e 'print quotemeta("https://stackoverflow.com/a/b/c"),"\n"'

sortie est \/a\/b\/c, ce qui est correct et comme indiqué dans perldoc -f quotemeta.

Maintenant, sous débogueur, la sortie devient \\/a\\/b\\/c. Je pensais que le module de base que j'utilise était en train de redéfinir la fonction mais comme testé, il semble que le comportement ne se produit que sous le débogueur. L'appel CORE::quotemeta() renvoie la même sortie.

Quelqu'un peut-il m'éclairer?

Merci!

+0

"la sortie devient"? Êtes-vous en train de dire que l'impression produit quelque chose de différent? – ysth

+0

"la sortie devient" signifie la sortie de la commande 'x', c'est-à-dire, par opposition à la commande 'p' dans le débogueur. –

Répondre

8

quotemeta est un fusil de chasse, échappant à tous les caractères non-mots, qu'ils en aient besoin ou non. Le débogueur est moins lourd; ne citer que les caractères qui en ont besoin. (Les barres obliques inverses ne le font pas, les barres obliques ne le font pas.) Plus important encore, il le fait uniquement lorsque vous examinez des valeurs, pas lorsque vous les imprimez. Comparez:

DB<1> x quotemeta('a/b/c') 
0 'a\\/b\\/c' 

    DB<2> p quotemeta('a/b/c') 
a\/b\/c 
+0

J'ai utilisé la commande 'x' depuis, merci d'avoir signalé la commande 'p' –

3

Je ne trouve pas de référence pour cela, mais le débogueur perl, quand on lui demandera de sortir une chaîne, la re-citera donc c'est une valeur littérale sûre que vous pourriez coller dans un script. Votre valeur est correcte c'est le débogueur qui ajoute les antislashs. Il ya une option quote dans perldoc perldebug, vous pourriez essayer de jouer avec cela.

Questions connexes