2012-07-29 29 views
7

pragmas, como autodie, de acuerdo con los documentos, tienen un alcance léxico.pragmas de ámbito léxico

{ 
use autodie; 
.. 
.. 
} 
# Can die here 

¿Esto se aplica a todos los módulos cargados con use? por lo que yo sé, el uso es casi lo mismo que:

BEGIN { 
require autodie; 
autodie->import(LIST); 
} 

COMENZAR sucede en tiempo de compilación, necesita no está en el ámbito léxico, ¿Cómo puede ser que autodie conscientes de su alcance?

Gracias,

+0

¿Hay algo que quisiera hacer? ¿O es esto puramente por curiosidad? – ikegami

Respuesta

10

La respuesta corta es que el léxico de ámbito de pragmatic modules están escritos de manera explícita a comportarse de esa manera, y el uso de las variables internas y mágicos $^H%^H durante el tiempo de compilación para habilitar y deshabilitar características.

El compilador desempeña su papel localizando implícitamente estas variables para que su valor se restaure al final de compilar un bloque de código al principio. De esa manera, proporciona la base de la semántica léxica.

Originalmente solo estaba disponible la variable $^H. Contiene una máscara de bits que dicta qué opciones del compilador están disponibles en cualquier momento durante la compilación. Por eso, los únicos pragmas léxicos que se pudieron escribir fueron los que manipularon el conjunto definido de bits mágicos en $^H.

Más tarde se introdujo el hash %^H, y cualquier pragma ahora puede almacenar valores en este hash con claves que comienzan con el nombre del pragma. Debido a que el compilador localiza el hash de la misma manera que el escalar, cualquier pragma puede almacenar aquí la información de estado automáticamente.

El módulo autodie no manipula ninguna de estas variables, pero subclasifica el módulo Fatal, que hace todo el trabajo arduo. Utiliza %^H para realizar un seguimiento de los operadores que se han convertido en fatales, y se basa en el compilador para descartar esta información al final del bloque.

+1

mención de perlpragma sería bueno – ysth

7

Desde el método de importación de Fatal.pm que es el back-end de autodie, disfrutar de este:

# Dark magic to have autodie work under 5.8 
# Copied from namespace::clean, that copied it from 
# autobox, that found it on an ancient scroll written 
# in blood. 

# This magic bit causes %^H to be lexically scoped. 
$^H |= 0x020000; 

Así que la respuesta es en realidad es una manera de hacer que sus importaciones conscientes de su léxico alcance, pero está profundamente enredado con las agallas de perl y no está destinado a los programadores ordinarios para su uso.

+1

No, explica solo el paso adicional necesario para que los pragmas basados ​​en '%^H' funcionen en 5.8, no solo en 5.10+. – ysth

+0

Sí, realmente solo mostré la parte más aterradora para transmitir una sensación general de la magia involucrada. Fue una respuesta en el sentido de que confirmaba la sensación del interrogador de que los pragmas léxicos no pueden implementarse con técnicas de importación de módulos "normales". –

+1

pero eso es completamente incorrecto ... pueden ser implementados fácilmente. ver http://perldoc.perl.org/perlpragma.html – ysth

1

No es require eso es interesante; es lo que hace el pragma en import.

La mayoría de (todos?) Pragmas usan $^H o %^H. El analizador los localiza en el ámbito analizado, lo que significa que los restaura al valor que tenían antes de

Tome strict, por ejemplo. Es import modifica $^H. $^H contiene una serie de indicadores que instruyen al compilador sobre cómo comportarse.

$ perl -e' 
    BEGIN { printf "%04X\n", $^H } 
    { 
     use strict; 
     BEGIN { printf "%04X\n", $^H } 
    } 
    BEGIN { printf "%04X\n", $^H } 
' 
0100 
0702 
0100 

$^H está reservado para el uso de Perl, pero localizados de manera similar %^H está disponible para uso general. Por ejemplo, feature::qw_comment se engancha en el analizador una vez, cuando se carga por require, pero no hace nada a menos que $^H{'feature::qw_comments::'} sea verdadero. Su importación es equivalente a

sub import { $^H{'feature::qw_comments::'} = 1; } 
Cuestiones relacionadas