Domanda

Pragmas, come autodie, secondo i Documenti, sono scambiati lessicamente.

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

Si applica a tutti i moduli caricati con use? Per quanto ne so, use è quasi la stessa cosa:

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

BEGIN avviene a tempo di compilazione e richiedere non è scambiare lessicamente.Allora, come è autodie consapevole del suo scopo?

È stato utile?

Soluzione

La risposta breve è che moduli pragmatici sono esplicitamente scritti per comportarsi in questo modo e utilizzare il modo Variabili interne magiche $^H e %^H durante il tempo di compilazione per abilitare e disabilitare le funzioni.

Il compilatore riproduce la sua parte implicitamente localizzando queste variabili in modo che il loro valore sia ripristinato alla fine della compilazione di un blocco di codice a ciò che era all'inizio. In questo modo fornisce la base della semantica lessicale.

Originariamente solo la variabile $^H era disponibile. Contiene una maschera bit che impone a quali opzioni del compilatore sono disponibili in qualsiasi momento durante la compilazione. A causa di ciò gli unici pragmi lessicali che potrebbero essere scritti erano quelli che hanno manipolato il set definito di bit magici in $^H.

Successivamente è stato introdotto l'hash %^H e qualsiasi PRAGMA può ora archiviare valori in questo hash con tasti che iniziano con il nome del Pragma. Poiché il compilatore localizza l'hash allo stesso modo del Scalare, qualsiasi PRAGMA può memorizzare automaticamente le informazioni sullo stato degli scampi.

Il modulo autodie non manipolare una di queste variabili, ma sottoclassi il Fatal Module che fa tutto il modulo lavoro duro. Utilizza %^H per tenere traccia di quali operatori sono stati resi fatali e si basa sul compilatore per scartare queste informazioni alla fine del blocco.

Altri suggerimenti

Dal metodo di importazione di Fatal.pm che è il backend di autodie, goditi questo:

# 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;
.

Quindi la risposta è che c'è davvero un modo per rendere le tue importazioni consapevoli del loro ambito lessicinale, ma è profondamente impigliato con il coraggio di Perl e non significato per i programmatori ordinari da utilizzare.

non è require che è interessante;È ciò che il Pragma fa in import.

La maggior parte (tutti?) Pragmas usa $^H o %^H.Il parser localizza questi allo scopo che viene analizzato, il che significa che li ripristina il valore che avevano prima

Take rigoroso , ad esempio.Il suo import modifica $^H.$^H contiene una serie di flag che incarica il compilatore come comportarsi.

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

$^H è riservato per l'utilizzo del Perl, ma anche %^H localizzato è disponibile per uso generale.Ad esempio, Caratteristica :: qw_comment ganci nel parser una volta, quando è caricato darequire, ma non fa nulla a meno che $^H{'feature::qw_comments::'} sia vero.La sua importazione è equivalente a

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top