Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

sub foo(&)

1 réponse
Avatar
espie
Une fois n'est pas coutume, c'est pas une question, mais une info
d'autosatisfaction.

J'ai un bout de code ou j'avais envie de rajouter du code de debug.
Ca finit le plus souvent en pseudo-print:

debug "Params=@params\n";

Le souci, c'est que les parametres sont evalues meme si on n'est pas en
mode debug.

Un peu d'experimentation avec les prototypes donnent le bon resultat.
Le premier truc sympa, c'est que
sub { 1, 2, 3}
renvoie effectivement une liste de valeurs dans un contexte wantarray.

et le 2e truc, c'est que la syntaxe est relativement agreable:

sub debug(&)
{
my $vals = shift;
if ($debugmode) {
print STDERR (&$vals);
}
}


debug {"Params=@params\n"};

j'ai juste un peu rame a essaye de faire de l'objet avant de decouvrir que
ce genre de forme syntaxique ne marchait que sur de vrais appels de fonction
(a raison). Faudra donc ecrire un wrapper fonctionnel autour d'une classe
quelconque si on veut faire plus complique...

Il faut aussi faire attention au fait que cette syntaxe allegee n'est
disponible QUE si le bloc de code est le premier parametre, sinon il faut
garder le sub anonyme et tutti-quanti.

Je n'ai pas vraiment mesure les differences en perf, mais vu que dans certains
cas, le code de debug allait sans doute se taper une liste de 5000 valeurs,
je pense qu'on y gagne...

Un petit regret: apparemment, on ne peut pas faire de
sub foo([$&])

ca serait pourtant bien pratique pour avoir `la meme fonction' qui prend
un bloc de code a evaluer (si celui-ci est couteux) ou une chaine a
afficher... (sachant que sub foo(\[$&]) existe mais n'a pas la semantique
appropriee).

Commentaires ou questions bienvenus ;-)

1 réponse

Avatar
Paul Gaborit
À (at) Tue, 4 Nov 2008 08:38:14 +0000 (UTC),
(Marc Espie) écrivait (wrote):
Une fois n'est pas coutume, c'est pas une question, mais une info
d'autosatisfaction.

J'ai un bout de code ou j'avais envie de rajouter du code de debug.
Ca finit le plus souvent en pseudo-print:

debug "Params=@paramsn";

Le souci, c'est que les parametres sont evalues meme si on n'est pas en
mode debug.

Un peu d'experimentation avec les prototypes donnent le bon resultat.
Le premier truc sympa, c'est que
sub { 1, 2, 3}
renvoie effectivement une liste de valeurs dans un contexte wantarray.

et le 2e truc, c'est que la syntaxe est relativement agreable:

sub debug(&)
{
my $vals = shift;
if ($debugmode) {
print STDERR (&$vals);
}
}


debug {"Params=@paramsn"};

j'ai juste un peu rame a essaye de faire de l'objet avant de decouvrir que
ce genre de forme syntaxique ne marchait que sur de vrais appels de fonction
(a raison). Faudra donc ecrire un wrapper fonctionnel autour d'une classe
quelconque si on veut faire plus complique...

Il faut aussi faire attention au fait que cette syntaxe allegee n'est
disponible QUE si le bloc de code est le premier parametre, sinon il faut
garder le sub anonyme et tutti-quanti.

Je n'ai pas vraiment mesure les differences en perf, mais vu que dans certains
cas, le code de debug allait sans doute se taper une liste de 5000 valeurs,
je pense qu'on y gagne...

Un petit regret: apparemment, on ne peut pas faire de
sub foo([$&])

ca serait pourtant bien pratique pour avoir `la meme fonction' qui prend
un bloc de code a evaluer (si celui-ci est couteux) ou une chaine a
afficher... (sachant que sub foo([$&]) existe mais n'a pas la semantique
appropriee).

Commentaires ou questions bienvenus ;-)



Personnellement, pour les messages de debug ou de trace, j'ai pris
l'habitude de travailler avec une constante :

########################
#!/usr/bin/perl

use strict;
use warnings;

use constant DEBUG => 0; # ou 1 pour le debug

# Pour un gros bloc de debug
if (DEBUG) {
# le code pour debug...
warn "Code de debugn";
}

# Autre syntaxe possible
DEBUG && do {
# le code pour debug...
warn "Code de debugn";
};

# Pour un simple affichage
warn "Affichage de debugn" if DEBUG;
########################

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>