8
votes

Comment puis-je qualifier une variable en tant que const / finale à Perl?

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;


0 commentaires

3 Réponses :


9
votes
use Const::Fast;
const my $infilename => "input_56_12.txt";

3 commentaires

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 const :: Fast) avant Perl5.10.1 - Il y avait des bugs intéressants.



8
votes
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.

3 commentaires

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 a un bloc implicite 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 (); 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.



4
votes

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";


5 commentaires

@eugene: Qu'est-ce qu'une variable star ?


Cela abuse une optimisation des sous-programmes constants ajoutés à Perl 5.10.0. Sub FOO () {"Constant"} sera enregistré comme une référence à "constante" 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"} , qui se trouve également ce que le constant 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 , et sans l'interpolation et les problèmes auto-attroting des sous-marins constants


@RAFL => Ici, la variable est dans $ infilename pas et infilename et semble fonctionner correctement en 5.8.8


OOH, je lis accidentellement cela comme une affectation Symtab, pas une affectation globale globale. $ :: {foo} = \ 42 est ce que je voulais dire. Désolé!