Perl sous-Routine de Prototypage — La bonne façon de le faire

J'ai une sous-routine appelée debug - je utiliser dans mon code. Fondamentalement, ça me permet de voir ce qu'il se passe, etc.

sub debug {
    my $message      = shift;
    my $messageLevel = shift;

    our $debugLevel;
    $messageLevel = 1 if not defined $messageLevel;
    return if $messageLevel > $debugLevel;
    my $printMessage = "    " x $messageLevel . "DEBUG: $message\n";
    print STDERR $printMessage;
    return $printMessage;
}

Je veux prototype, donc je peux faire des choses comme ceci:

debug "Here I am! And the value of foo is $foo";

ou

debug "I am in subroutine foo", 3;

En même temps, j'aime mettre des sous-routine définitions dans le fond de mon programme, de sorte que vous n'avez pas à wade 1/2-chemin à travers le code à trouver de la viande du programme.

J'aimerais faire ceci:

sub debug($;$);  #Prototype debug subroutine

/Here goes the main program code/

sub debug {      #The entire subroutine goes here
   /Here goes the debug subroutine code/
}

Cependant, je reçois un message d'avertissement lorsque je fais ceci:

Prototype mismatch: sub main::debug ($;$) vs none at foo.pl line 249.

Donc, je suis coincé mettre la définition du prototype dans les deux endroits. Quelle est la bonne façon de faire quelque chose comme cela?


RÉPONSE

Arrêter! Module de temps. – Chris Lutz

Un module? Tu veux dire créer un fichier séparé? Qui ajoute un peu de complication, sans résoudre le problème que j'essaie de résoudre: la Suppression de la nécessité pour les parenthèses autour de ce sous-programme particulier.

notre $debugLevel; ne devrait pas être dans le sous-corps de toute façon, mais je suis d'accord avec Chris sur ce. – Sinan Ünür il y a 3 heures

La our $debugLevel n'a pas à être là, dans ce cas, mais si j'ai défini une classe, et je veux utiliser cette sous-routine dans ma classe à des fins de débogage, j'en ai besoin. Je peux le mettre dans ma classe comme ::debug

Étonnamment, Bien plus que tout ce que vous avez toujours voulu savoir sur les prototypes en Perl ne traite pas de cela, mais je crois que vous ne pouvez pas éviter d'écrire le prototype dans les deux endroits.

J'espérais un moyen facile de l'éviter. Il y a un moyen comme Eric Strom a montré. Malheureusement, c'est plus que mon debug routine.

J'ai l'habitude d'utiliser des prototypes, mais j'ai pris l'habitude de ne pas écrire des déclarations distinctes pour les sous-routines et à l'aide de parenthèses sur tous les appels: debug("je suis dans la fonction toto", 3);. Il a été suggéré que les prototypes ne sont pas vraiment une bonne idée. TMTOWTDI – Keith Thompson 3 heures

Sauf que moi j'ai tendance à faire:

debug (qq(The value of Foo is "$foo"), 3);

qui peuvent être moins clair lors de la lecture, et peut être une douleur à type de. Chaque fois que vous double-up parenthese, vous êtes d'avoir des ennuis. La dernière chose que je veux faire, c'est de débogage mes instructions de débogage.

Pourquoi voulez-vous prototypes? Voir cette question Comment passer des paramètres facultatifs à une fonction Perl – TLP

Oui, il ya beaucoup de problèmes avec le prototypage. Le principal problème est qu'il n'a tout simplement pas faire ce que les gens pensent qu'il doit faire: Déclarer les types de variables pour les paramètres que vous passez à votre fonction.

Ce n'est pas la raison pour laquelle je suis en utilisant le prototypage ici.

J'utilise rarement des prototypes. En fait, c'est probablement le seul cas dans l'ensemble de mon code où je ne.

Stop!!! Module de temps.
our $debugLevel; ne devrait pas être dans le sous-corps de toute façon, mais je suis d'accord avec Chris sur ce.
Étonnamment, perlmonks.org/?node_id=861966 n'a pas d'adresse, mais je crois que vous ne pouvez pas éviter d'écrire le prototype dans les deux endroits.
J'ai l'habitude d'utiliser des prototypes, mais j'ai pris l'habitude de pas rédaction des déclarations distinctes pour les sous-routines et à l'aide de parenthèses sur tous les appels: debug("I am in subroutine foo", 3);. Il a été suggéré que les prototypes ne sont pas vraiment une bonne idée. TMTOWTDI
Pourquoi voulez-vous prototypes? Voir cette récente de la question stackoverflow.com/q/8124138/725418

OriginalL'auteur David W. | 2011-11-14