Par exemple, dans des situations comme ci-dessous, je ne veux pas modifier la valeur de $ infilename code> n'importe où dans le programme après l'initialisation.
my $infilename = "input_56_12.txt";
open my $fpin, '<', $infilename
or die $!;
...
print "$infilename has $result matches\n";
close $fpin;
3 Réponses :
use Const::Fast; const my $infilename => "input_56_12.txt";
Assurez-vous d'avoir réadonné :: XS installé également, pour une plus grande vitesse.
@DAXIM: l'a ajouté à la réponse.
Une autre chose - N'utilisez pas de variables réadonnées (avec le module lisonly ou i> const :: Fast) avant Perl5.10.1 - Il y avait des bugs intéressants.
use constant INPUT_FILE => "input_56_12.txt"; Might be what you want. If you need to initialize it to something that may change at run time then you might be out of luck, I don't know if Perl supports that.EDIT: Oh, look at eugene y's answer, Perl does support that.
Comment avez-vous compris de la réponse d'Eugène que Perl permet d'initialiser quelque chose qui pourrait changer au moment de l'exécution?
@Lazer => Utiliser code> a un bloc code> implicite code> autour de celui-ci, ce qui en fait une affectation de l'heure de compilation. Les exemples dans les deux réponses d'Eugène travaillent au moment de l'exécution. écrire ci-dessus à l'exécution
* INPUT_FILE = SUB () {"INPUT ..."}; Imprimer INPUT_FILE (); code> qui est un peu maladroit et ne vous donne aucune inlinication.
@Lazer: sa réponse impliquée en utilisant des variables normales, mais à l'aide d'un modificateur spécial "Readonly" (à partir d'un module) pour le rendre illégal de changer une fois que cela a été défini.
Un autre moyen populaire de créer des scalaires en lecture seule consiste à modifier l'entrée de la table de symboles pour la variable à l'aide d'un typeGLOB:
*infilename = \"input_56_12.txt";
@eugene: Qu'est-ce qu'une variable i> star i>?
Cela abuse une optimisation des sous-programmes constants ajoutés à Perl 5.10.0. Sub FOO () {"Constant"} code> sera enregistré comme une référence à
"constante" code> dans la table des symboles pour ne pas nécessiter de globe global pour une seule valeur. Être portable, vous devriez faire
* foo = sub () {"constante"} code>, qui se trouve également ce que le
constant code> pragma fait, donc vous pourriez Utilisez également cela, obtenez l'optimisation / et / être portable.
À mon avis, il s'agit d'un des moyens les plus beaux pour faire une constante à Perl, plus rapide que lisonly code>, et sans l'interpolation et les problèmes auto-attroting des sous-marins constants
@RAFL => Ici, la variable est dans $ infilename code> pas
et infilename code> et semble fonctionner correctement en 5.8.8
OOH, je lis accidentellement cela comme une affectation Symtab, pas une affectation globale globale. $ :: {foo} = \ 42 code> est ce que je voulais dire. Désolé!