Des sous-programmes constants, c'est-à-dire des sous-programmes avec un prototype vide et une valeur de retour constante, sont en ligne. Voilà comment la constant pragma définit les constantes:
sub five() { 5 }
serait inline si on voit avant sa première utilisation.
Dans le cas contraire, Perl permet de redéfinir dynamiquement les sous-programmes lors de l'exécution, de sorte que le mode inline ne convient pas.
Pour les sous-programmes qui retournent toujours la même valeur avec les mêmes entrées, vous pouvez utiliser memoization.
Chapter 13 of Programming Perl fournit des informations sur les étapes d'optimisation prises par perl
.
Ceci est appelé pliage constant. Le pliage constant n'est pas limité à des cas simples tels que le passage de 2 ** 10 à 1024 au moment de la compilation. Il résout également les appels de fonction - à la fois les sous-programmes intégrés et les sous-programmes déclarés par l'utilisateur qui satisfont aux critères de la section «Fonctions de Constant Inline» du Chapitre 6, Sous-programmes. Rappelant la connaissance notoire des compilateurs FORTRAN de leurs propres fonctions intrinsèques, Perl sait également lequel de ses propres built-ins à appeler pendant la compilation. C'est pourquoi si vous essayez de prendre le log de 0.0 ou le sqrt d'une constante négative, vous encourrez une erreur de compilation, pas une erreur d'exécution, et l'interpréteur n'est jamais exécuté du tout.
Voir également perldoc perlguts.
Vous pouvez voir l'effet de vous-pliage constant:
#!/usr/bin/perl
use strict; use warnings;
sub log_ok() { 1 }
if (log_ok) {
warn "log ok\n";
}
perl -MO=Deparse t.pl
Sortie:
sub log_ok() { 1 }
use warnings;
use strict 'refs';
do {
warn "log ok\n"
};
t.pl syntax OK
Ici, le pliage constant a conduit au remplacement du bloc if
avec un bloc do
parce que le compilateur savait que log_ok
retournerait toujours une vraie valeur. D'autre part, avec:
#!/usr/bin/perl
use strict; use warnings;
sub log_ok() { 0.5 > rand }
if (log_ok) {
warn "log ok\n";
}
sortie Deparse:
sub log_ok() {
use warnings;
use strict 'refs';
0.5 > rand;
}
use warnings;
use strict 'refs';
if (log_ok) {
warn "log ok\n";
}
t.pl syntax OK
Un compilateur C
aurait remplacé le if (log_ok)
avec if (0.5 > rand)
. perl
ne fait pas cela.
Vous devriez toujours suivre les conseils, même si les possibilités d'inlining peuvent sembler plus limitées dans Perl. –