2010-11-09 4 views
2

Je crois me souvenir que Perl 5 formats seulement travaillé avec les variables de package et PBP semble appuyer cette affirmation à la page 449:Depuis combien de temps les formats Perl 5 sont-ils capables de gérer les variables lexicales?

Formats se fondent sur des variables globales pour la configuration, et sur les variables de package pour les données qu'ils sont pour formater (voir le chapitre 5).

Mais un test rapide semble démontrer le contraire (testé avec 5.8.9, 5.10.0 et 5.12.1):

#!/usr/bin/perl 

use strict; 
use warnings; 

my $foo = "hello world"; 
write; 

format STDOUT = 
@<<<<<<<<<<<<<<< 
$foo 
. 

ce changement est dans une version de Perl 5 ou am J'ai mal compris quelque chose?

+1

PBP semble avoir obtenu ce mauvais, au moins de ce que vous avez posté ici. Je ne me souviens pas si je l'ai marqué sur ma copie griffonnée à l'arc-en-ciel que j'ai remise à Damian, et que ma copie propre est à la maison. – tchrist

+0

Les noms 'format' que l'on charge les variables' $ ~ 'et' $^'par-filehandle sont ceux qui sont visibles par le paquet. Vous ne pouvez pas simplement y mettre '* WHATEVER {FORMAT}'; il stresse, bien que je ne sais pas pourquoi. Semble une extension logique. – tchrist

+0

S'il vous plaît ne pas prendre ce commentaire aussi critique que cela semble être: ne sont pas des formats Perl, en grande, déprécié? – Axeman

Répondre

4

Depuis 5,001? De perlform:

Les variables lexicales (déclarées avec « mon ») ne sont pas visibles dans un format à moins que le format est déclaré dans le cadre de la variable lexicale. (Ils n'étaient pas visibles du tout avant la version 5.001.)

+3

Un 'format' fonctionne comme une déclaration de sous-routine * mais un' write' fonctionne comme une invocation de sous-routine *, donc vous avez besoin de variables à portée statiques disponibles pour les premières mais dynamiquement à portée de variables. La plupart d'entre nous préfèrent les premiers sur les seconds, en ne recourant qu'aux variables locales «locales» sur le système. Par exemple, cela n'a aucun sens d'avoir le '$ /' lexical, parce que 'chomp' et' readline' ne peuvent pas le voir; Voilà pourquoi c'est une dynamique. – tchrist

+0

Peut-être que le problème était que vous ne pouviez pas déclarer un format dans une fonction à l'époque (et donc besoin de variables globales). J'ai besoin de faire plus de recherches. –

+0

Le simple fait que quelque chose ne se trouve pas dans une fonction ne signifie pas qu'elle doit utiliser des variables de package. Il y a des lexiques à portée de fichier à avoir. – tchrist

Questions connexes