je reviens sur un vieux post
où l'on m'a conseillé d'utiliser des 'use constant'
afin d'optimiser le code entre mode debug ou non debug.
il y a d'ailleurs un article là dessus sur http://www.perlmonks.org/index.pl?node_id=113154
En gros pour mettre des traces dans le code faire :
use constant DEBUG_C => (1);
$log->debug(...) if(DEBUG);
Ca fonctionne très bien,
mais il y a qlq chose que je ne m'explique pas.
Dans le code suivant :
use constant DEBUG=>( 1 );
if( DEBUG ){
print STDERR "### COUCOU ###\n";
sub mySub {
...
}
}
Et bien si DEBUG vaut 0,
le print n'est pas effectué,
par contre la sub mySub existe (je peux l'appeler sans erreur).
C'est surement normal, mais quelle est l'explication de ce comportement ???
merci pour vos lumières,
Cyrille
-==-==-==-
... Faire un don d'ordinateurs déclassés : http://internethon.afnet.fr
-==-==-==-
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Acide
"Cyrille" wrote in message news:bqn0kd$ng1$
Bonjour,
je reviens sur un vieux post où l'on m'a conseillé d'utiliser des 'use constant' afin d'optimiser le code entre mode debug ou non debug. il y a d'ailleurs un article là dessus sur http://www.perlmonks.org/index.pl?node_id3154
En gros pour mettre des traces dans le code faire : use constant DEBUG_C => (1); $log->debug(...) if(DEBUG);
Ca fonctionne très bien, mais il y a qlq chose que je ne m'explique pas.
Dans le code suivant :
use constant DEBUG=>( 1 ); if( DEBUG ){ print STDERR "### COUCOU ###n"; sub mySub { ... } }
Et bien si DEBUG vaut 0, le print n'est pas effectué, par contre la sub mySub existe (je peux l'appeler sans erreur).
C'est surement normal, mais quelle est l'explication de ce comportement ???
D'apres ce que je vois, tu ne met entre DEBUG l'appel et pas la fonction ? Si oui dans ce cas tu inhibe simplement l'appel parce car tu en as surement besoin ailleurs (en tout cas c'est la seul raison algorithmique que je vois)
Sinon si tout est bien entre DEBUG (appel + fonction) je capte pas le probleme.
Alors ca t'aide ?
Acide.
"Cyrille" <cyrilleml@kbuilder.net> wrote in message
news:bqn0kd$ng1$1@news-reader5.wanadoo.fr...
Bonjour,
je reviens sur un vieux post
où l'on m'a conseillé d'utiliser des 'use constant'
afin d'optimiser le code entre mode debug ou non debug.
il y a d'ailleurs un article là dessus sur
http://www.perlmonks.org/index.pl?node_id3154
En gros pour mettre des traces dans le code faire :
use constant DEBUG_C => (1);
$log->debug(...) if(DEBUG);
Ca fonctionne très bien,
mais il y a qlq chose que je ne m'explique pas.
Dans le code suivant :
use constant DEBUG=>( 1 );
if( DEBUG ){
print STDERR "### COUCOU ###n";
sub mySub {
...
}
}
Et bien si DEBUG vaut 0,
le print n'est pas effectué,
par contre la sub mySub existe (je peux l'appeler sans erreur).
C'est surement normal, mais quelle est l'explication de ce comportement
???
D'apres ce que je vois, tu ne met entre DEBUG l'appel et pas la fonction ?
Si oui dans ce cas tu inhibe simplement l'appel parce car tu en as surement
besoin ailleurs (en tout cas c'est la seul raison algorithmique que je vois)
Sinon si tout est bien entre DEBUG (appel + fonction) je capte pas le
probleme.
je reviens sur un vieux post où l'on m'a conseillé d'utiliser des 'use constant' afin d'optimiser le code entre mode debug ou non debug. il y a d'ailleurs un article là dessus sur http://www.perlmonks.org/index.pl?node_id3154
En gros pour mettre des traces dans le code faire : use constant DEBUG_C => (1); $log->debug(...) if(DEBUG);
Ca fonctionne très bien, mais il y a qlq chose que je ne m'explique pas.
Dans le code suivant :
use constant DEBUG=>( 1 ); if( DEBUG ){ print STDERR "### COUCOU ###n"; sub mySub { ... } }
Et bien si DEBUG vaut 0, le print n'est pas effectué, par contre la sub mySub existe (je peux l'appeler sans erreur).
C'est surement normal, mais quelle est l'explication de ce comportement ???
D'apres ce que je vois, tu ne met entre DEBUG l'appel et pas la fonction ? Si oui dans ce cas tu inhibe simplement l'appel parce car tu en as surement besoin ailleurs (en tout cas c'est la seul raison algorithmique que je vois)
Sinon si tout est bien entre DEBUG (appel + fonction) je capte pas le probleme.
Alors ca t'aide ?
Acide.
Cyrille
Alors ca t'aide ? Acide.
non ;o)
Essaye ça et tu comprendras ma question :
#!/usr/local/bin/perl -w use strict ; use constant DEBUG=>( 0 ); if( DEBUG ){ print "DEBUG: onn"; sub myFunc { print "dans myFuncn"; } }else{ print "DEBUG: offn"; } myFunc();
Alors ?
-==-==-==- ... FAQ Mozilla/Netscape 7 en français : http://pascal.chevrel.free.fr -==-==-==-
Alors ca t'aide ?
Acide.
non ;o)
Essaye ça et tu comprendras ma question :
#!/usr/local/bin/perl -w
use strict ;
use constant DEBUG=>( 0 );
if( DEBUG ){
print "DEBUG: onn";
sub myFunc {
print "dans myFuncn";
}
}else{
print "DEBUG: offn";
}
myFunc();
Alors ?
-==-==-==-
... FAQ Mozilla/Netscape 7 en français : http://pascal.chevrel.free.fr
-==-==-==-
#!/usr/local/bin/perl -w use strict ; use constant DEBUG=>( 0 ); if( DEBUG ){ print "DEBUG: onn"; sub myFunc { print "dans myFuncn"; } }else{ print "DEBUG: offn"; } myFunc();
Alors ?
-==-==-==- ... FAQ Mozilla/Netscape 7 en français : http://pascal.chevrel.free.fr -==-==-==-
Acide
"Cyrille" wrote in message news:bqn4f6$u9r$
Alors ca t'aide ? Acide.
non ;o)
Essaye ça et tu comprendras ma question :
#!/usr/local/bin/perl -w use strict ; use constant DEBUG=>( 0 ); if( DEBUG ){ print "DEBUG: onn"; sub myFunc { print "dans myFuncn"; } }else{ print "DEBUG: offn"; } myFunc();
Je suis pas expert en perl, mais c'est de l'interprété et non
un langage compiler. Le scope de ta fonction est visible de partout. le if(debug) ne servant pas pour ta myfunc.
en fait quand il lit avant d'exécuter ton code perl, il cherche les sub sans interpreter le code qu'il l'entoure ni le code qu'elle contient. (verifie la syntaxe et genere un arbre de syntaxe abstraite).
Ta sub tu peux la declarer n'importe ou, il s'en fout. Quand il lit ton code a la passe execution, il fait debug faux j'appelle myFunc, jump sur la partie memoire de myFunc, l'execute et c'est tout.
Ce qui veut dire : * 1 le debug ne doit proteger que l'appel a la fonction * 2 y a pas de "compilation conditionnelle, genre preprocessueur C" * 3 : ton arbre d'execution sera plus gros avec cette technique de debuggage. si tu entoure la fonction.
Alors ?
Acide.
"Cyrille" <cyrilleml@kbuilder.net> wrote in message
news:bqn4f6$u9r$1@news-reader4.wanadoo.fr...
Alors ca t'aide ?
Acide.
non ;o)
Essaye ça et tu comprendras ma question :
#!/usr/local/bin/perl -w
use strict ;
use constant DEBUG=>( 0 );
if( DEBUG ){
print "DEBUG: onn";
sub myFunc {
print "dans myFuncn";
}
}else{
print "DEBUG: offn";
}
myFunc();
Je suis pas expert en perl, mais c'est de l'interprété et non
un langage compiler. Le scope de ta fonction est visible
de partout. le if(debug) ne servant pas pour ta myfunc.
en fait quand il lit avant d'exécuter ton code perl, il cherche
les sub sans interpreter le code qu'il l'entoure ni le code qu'elle
contient. (verifie la syntaxe et genere un arbre de syntaxe abstraite).
Ta sub tu peux la declarer n'importe ou, il s'en fout. Quand il lit
ton code a la passe execution, il fait debug faux j'appelle myFunc,
jump sur la partie memoire de myFunc, l'execute et c'est tout.
Ce qui veut dire :
* 1 le debug ne doit proteger que l'appel a la fonction
* 2 y a pas de "compilation conditionnelle, genre preprocessueur C"
* 3 : ton arbre d'execution sera plus gros avec cette technique de
debuggage.
si tu entoure la fonction.
#!/usr/local/bin/perl -w use strict ; use constant DEBUG=>( 0 ); if( DEBUG ){ print "DEBUG: onn"; sub myFunc { print "dans myFuncn"; } }else{ print "DEBUG: offn"; } myFunc();
Je suis pas expert en perl, mais c'est de l'interprété et non
un langage compiler. Le scope de ta fonction est visible de partout. le if(debug) ne servant pas pour ta myfunc.
en fait quand il lit avant d'exécuter ton code perl, il cherche les sub sans interpreter le code qu'il l'entoure ni le code qu'elle contient. (verifie la syntaxe et genere un arbre de syntaxe abstraite).
Ta sub tu peux la declarer n'importe ou, il s'en fout. Quand il lit ton code a la passe execution, il fait debug faux j'appelle myFunc, jump sur la partie memoire de myFunc, l'execute et c'est tout.
Ce qui veut dire : * 1 le debug ne doit proteger que l'appel a la fonction * 2 y a pas de "compilation conditionnelle, genre preprocessueur C" * 3 : ton arbre d'execution sera plus gros avec cette technique de debuggage. si tu entoure la fonction.
Alors ?
Acide.
Cyrille
Je suis pas expert en perl, mais c'est de l'interprété et non un langage compiler. Le scope de ta fonction est visible de partout. le if(debug) ne servant pas pour ta myfunc.
Merci beaucoup d'avoir pris le temps d'une telle explication.
Du coup il ne doit pas y avoir d'autre méthode plus optimale pour activer un mécanisme de trace à la compilation qui permette d'avoir un code moins lourd quand on le desactive.
merci bye cyrille
-==-==-==- ... Faire un don d'ordinateurs déclassés : http://internethon.afnet.fr -==-==-==-
Je suis pas expert en perl, mais c'est de l'interprété et non
un langage compiler. Le scope de ta fonction est visible
de partout. le if(debug) ne servant pas pour ta myfunc.
Merci beaucoup d'avoir pris le temps d'une telle explication.
Du coup il ne doit pas y avoir d'autre méthode plus optimale
pour activer un mécanisme de trace à la compilation qui permette d'avoir un code moins lourd quand on le desactive.
merci
bye
cyrille
-==-==-==-
... Faire un don d'ordinateurs déclassés : http://internethon.afnet.fr
-==-==-==-
Je suis pas expert en perl, mais c'est de l'interprété et non un langage compiler. Le scope de ta fonction est visible de partout. le if(debug) ne servant pas pour ta myfunc.
Merci beaucoup d'avoir pris le temps d'une telle explication.
Du coup il ne doit pas y avoir d'autre méthode plus optimale pour activer un mécanisme de trace à la compilation qui permette d'avoir un code moins lourd quand on le desactive.
merci bye cyrille
-==-==-==- ... Faire un don d'ordinateurs déclassés : http://internethon.afnet.fr -==-==-==-
tyoup
Acide wrote:
Essaye ça et tu comprendras ma question :
#!/usr/local/bin/perl -w use strict ; use constant DEBUG=>( 0 ); if( DEBUG ){ print "DEBUG: onn"; sub myFunc { print "dans myFuncn"; } }else{ print "DEBUG: offn"; } myFunc();
Je suis pas expert en perl, mais c'est de l'interprété et non un langage compiler. Le scope de ta fonction est visible de partout. le if(debug) ne servant pas pour ta myfunc.
ça n'a rien à voir avec le fait d'être interprété ou non. si l'appel de myFunc est possible en dehors de la portée du bloc dans lequel la fonction est définie alors ça vient sûrement de la manière dont est (doit être ?) compilé/interprété Perl.
si c'est effectivement le cas alors je pense que la solution employée n'est pas digne d'un bon langage ;> (ya pire ya qu'à voir PHP lol)
ok ce que je dis n'apporte rien (et tout ce que je fais aussi :| ) mais c'est juste pour mettre mon petit grain de sel =) juste pour casser les pieds quoi ... :p
-- Tyoup<quoi ? moi je critique ?> -----<je sais pas pourquoi mais ":|" me fait penser à une grenouille>
Acide wrote:
Essaye ça et tu comprendras ma question :
#!/usr/local/bin/perl -w
use strict ;
use constant DEBUG=>( 0 );
if( DEBUG ){
print "DEBUG: onn";
sub myFunc {
print "dans myFuncn";
}
}else{
print "DEBUG: offn";
}
myFunc();
Je suis pas expert en perl, mais c'est de l'interprété et non
un langage compiler. Le scope de ta fonction est visible
de partout. le if(debug) ne servant pas pour ta myfunc.
ça n'a rien à voir avec le fait d'être interprété ou non. si l'appel de
myFunc est possible en dehors de la portée du bloc dans lequel la
fonction est définie alors ça vient sûrement de la manière dont est
(doit être ?) compilé/interprété Perl.
si c'est effectivement le cas alors je pense que la solution employée
n'est pas digne d'un bon langage ;> (ya pire ya qu'à voir PHP lol)
ok ce que je dis n'apporte rien (et tout ce que je fais aussi :| ) mais
c'est juste pour mettre mon petit grain de sel =)
juste pour casser les pieds quoi ... :p
--
Tyoup<quoi ? moi je critique ?>
-----<je sais pas pourquoi mais ":|" me fait penser à une grenouille>
#!/usr/local/bin/perl -w use strict ; use constant DEBUG=>( 0 ); if( DEBUG ){ print "DEBUG: onn"; sub myFunc { print "dans myFuncn"; } }else{ print "DEBUG: offn"; } myFunc();
Je suis pas expert en perl, mais c'est de l'interprété et non un langage compiler. Le scope de ta fonction est visible de partout. le if(debug) ne servant pas pour ta myfunc.
ça n'a rien à voir avec le fait d'être interprété ou non. si l'appel de myFunc est possible en dehors de la portée du bloc dans lequel la fonction est définie alors ça vient sûrement de la manière dont est (doit être ?) compilé/interprété Perl.
si c'est effectivement le cas alors je pense que la solution employée n'est pas digne d'un bon langage ;> (ya pire ya qu'à voir PHP lol)
ok ce que je dis n'apporte rien (et tout ce que je fais aussi :| ) mais c'est juste pour mettre mon petit grain de sel =) juste pour casser les pieds quoi ... :p
-- Tyoup<quoi ? moi je critique ?> -----<je sais pas pourquoi mais ":|" me fait penser à une grenouille>
Ronan Le Hy
Cyrille writes:
use constant DEBUG=>( 1 ); if( DEBUG ){ print STDERR "### COUCOU ###n"; sub mySub { ... } }
Et bien si DEBUG vaut 0, le print n'est pas effectué, par contre la sub mySub existe (je peux l'appeler sans erreur).
Une sub declaree comme ca : sub masub { ... } peut avoir sa definition un peu n'importe ou dans le fichier, elle est definie pareil et visible partout. L'interet eventuel de la mettre dans un bloc particulier est d'avoir acces aux variables visibles dans ce bloc. Elle est compilee et presente dans le package quoi qu'il arrive (quel que soit la valeur de DEBUG, ici).
S'il s'agit de definir differemment une sub selon la valeur de DEBUG, (et eventuellement restreindre la visilite de ladite sub), on peut faire par exemple : my $debug; if (DEBUG) { $debug = sub { warn @_ } } else { $debug = sub {}; } $debug->($message);
Si on veut vraiment eviter le temps de compilation de la sub si DEBUG est faux, on peut jouer avec require+un module separe, ou eval STRING, je suppose, mais je ne suis pas sur que ca vaille le coup. S'il y a beaucoup de fonctions pas souvent utilisees, et qu'on veut economiser sur leur compilation/stockage, on peut jouer avec AUTOLOAD comme CGI.pm (du coup elles seront creees dynamiquement une fois pour toutes, uniquement quand on les utilise).
Ah, et puis il y a sub debug { if (DEBUG) { warn @_; } } qui est visiblement correctement simplifie a la compilation.
use constant DEBUG=>( 1 );
if( DEBUG ){
print STDERR "### COUCOU ###n";
sub mySub {
...
}
}
Et bien si DEBUG vaut 0,
le print n'est pas effectué,
par contre la sub mySub existe (je peux l'appeler sans erreur).
Une sub declaree comme ca :
sub masub { ... }
peut avoir sa definition un peu n'importe ou dans le fichier, elle est
definie pareil et visible partout. L'interet eventuel de la mettre
dans un bloc particulier est d'avoir acces aux variables visibles dans
ce bloc. Elle est compilee et presente dans le package quoi qu'il
arrive (quel que soit la valeur de DEBUG, ici).
S'il s'agit de definir differemment une sub selon la valeur de DEBUG,
(et eventuellement restreindre la visilite de ladite sub), on peut
faire par exemple :
my $debug;
if (DEBUG)
{
$debug = sub { warn @_ }
}
else
{
$debug = sub {};
}
$debug->($message);
Si on veut vraiment eviter le temps de compilation de la sub si DEBUG est
faux, on peut jouer avec require+un module separe, ou eval STRING, je
suppose, mais je ne suis pas sur que ca vaille le coup. S'il y a beaucoup
de fonctions pas souvent utilisees, et qu'on veut economiser sur leur
compilation/stockage, on peut jouer avec AUTOLOAD comme CGI.pm (du coup
elles seront creees dynamiquement une fois pour toutes, uniquement quand
on les utilise).
Ah, et puis il y a
sub debug
{
if (DEBUG)
{
warn @_;
}
}
qui est visiblement correctement simplifie a la compilation.
use constant DEBUG=>( 1 ); if( DEBUG ){ print STDERR "### COUCOU ###n"; sub mySub { ... } }
Et bien si DEBUG vaut 0, le print n'est pas effectué, par contre la sub mySub existe (je peux l'appeler sans erreur).
Une sub declaree comme ca : sub masub { ... } peut avoir sa definition un peu n'importe ou dans le fichier, elle est definie pareil et visible partout. L'interet eventuel de la mettre dans un bloc particulier est d'avoir acces aux variables visibles dans ce bloc. Elle est compilee et presente dans le package quoi qu'il arrive (quel que soit la valeur de DEBUG, ici).
S'il s'agit de definir differemment une sub selon la valeur de DEBUG, (et eventuellement restreindre la visilite de ladite sub), on peut faire par exemple : my $debug; if (DEBUG) { $debug = sub { warn @_ } } else { $debug = sub {}; } $debug->($message);
Si on veut vraiment eviter le temps de compilation de la sub si DEBUG est faux, on peut jouer avec require+un module separe, ou eval STRING, je suppose, mais je ne suis pas sur que ca vaille le coup. S'il y a beaucoup de fonctions pas souvent utilisees, et qu'on veut economiser sur leur compilation/stockage, on peut jouer avec AUTOLOAD comme CGI.pm (du coup elles seront creees dynamiquement une fois pour toutes, uniquement quand on les utilise).
Ah, et puis il y a sub debug { if (DEBUG) { warn @_; } } qui est visiblement correctement simplifie a la compilation.