2012-08-03 7 views
7

Parece que hay un símbolo en la principal llamado '_<-' (sin las comillas) de la misma manera que las otras cosas que parecen podrían ser identificadores: '_</usr/perl/lib/Carp.pm', por ejemplo.¿Puedo obtener un identificador para - fuente?

¿Hay alguna forma de usarlo?

¿O tendría que usar un filtro de fuente si espero leer la fuente de entrada?


En respuesta a la mafia: No sé dónde se activaría Debug. Después de volcar la tabla base, aparece un volcado de% INC:

$VAR1 = { 
     'warnings/register.pm' => 'C:/strawberry/perl/lib/warnings/register.pm', 
     'XSLoader.pm' => 'C:/strawberry/perl/lib/XSLoader.pm', 
     'English.pm' => 'C:/strawberry/perl/lib/English.pm', 
     'Tie/Hash/NamedCapture.pm' => 'C:/strawberry/perl/lib/Tie/Hash/NamedCapture.pm', 
     'unicore/lib/Perl/_PerlIDS.pl' => 'C:/strawberry/perl/lib/unicore/lib/Perl/_PerlIDS.pl', 
     'unicore/Heavy.pl' => 'C:/strawberry/perl/lib/unicore/Heavy.pl', 
     'warnings.pm' => 'C:/strawberry/perl/lib/warnings.pm', 
     'utf8.pm' => 'C:/strawberry/perl/lib/utf8.pm', 
     'Config.pm' => 'C:/strawberry/perl/lib/Config.pm', 
     'overloading.pm' => 'C:/strawberry/perl/lib/overloading.pm', 
     'Symbol.pm' => 'C:/strawberry/perl/lib/Symbol.pm', 
     'Carp.pm' => 'C:/strawberry/perl/lib/Carp.pm', 
     'bytes.pm' => 'C:/strawberry/perl/lib/bytes.pm', 
     'Exporter/Heavy.pm' => 'C:/strawberry/perl/lib/Exporter/Heavy.pm', 
     'utf8_heavy.pl' => 'C:/strawberry/perl/lib/utf8_heavy.pl', 
     'strict.pm' => 'C:/strawberry/perl/lib/strict.pm', 
     'Exporter.pm' => 'C:/strawberry/perl/lib/Exporter.pm', 
     'vars.pm' => 'C:/strawberry/perl/lib/vars.pm', 
     'constant.pm' => 'C:/strawberry/perl/lib/constant.pm', 
     'Errno.pm' => 'C:/strawberry/perl/lib/Errno.pm', 
     'overload.pm' => 'C:/strawberry/perl/lib/overload.pm', 
     'Data/Dumper.pm' => 'C:/strawberry/perl/lib/Data/Dumper.pm' 
    }; 
+0

He actualizado mi respuesta para mostrar cómo leer el archivo fuente sin un filtro de origen de manera que funcione si el archivo fuente tiene o no un segmento '__DATA__'. – DavidO

+0

Gracias, @DavidO. Voy a probar cómo funciona en la compilación. – Axeman

+0

Solo seguí unos días más tarde para ver si la solución que proporcioné funcionó para usted. – DavidO

Respuesta

2

¿O tendré que usar un filtro de fuente si espero leer la fuente de entrada?

Si el archivo de origen tiene una etiqueta __END__ o __DATA__, entonces el gestor de archivo DATA está disponible. ... que en sí mismo es aburrido. Lo que es interesante es que se puede seek a la posición 0, y que le llevará a la parte superior del archivo de origen:

use Carp; 

print "Just another Perl hacker,\n"; 

eval { 
    no warnings qw/unopened/; 
    seek DATA, 0, 0 
     or croak "Script lacking __END__ or __DATA__ tag has no DATA filehandle."; 
}; 
if([email protected]) { 
    while(<DATA>){ 
     print; 
    } 
} 
else { 
    carp [email protected]; 
} 

__END__ 

Este script se ejecutará (impresión 'Sólo otro hacker de Perl,'), y luego va a terminar imprimiendo su propia fuente.

En el código anterior, si el bloque eval atrapa una excepción, la alternativa podría ser utilizar FindBin y $0, abrir el archivo fuente y luego leerlo. Poniendo todo junto, así es como se ve:

BEGIN { 
    use Carp; 

    sub read_source { 
     my $source; 
     local $/ = undef; 
     eval { 
      no warnings qw(unopened); 
      my $DATA_position = tell DATA; 
      croak "'tell DATA' failed: Probably no __END__ or __DATA__ segment." 
       if $DATA_position < 0; 
      seek DATA, 0, 0 
       or croak 
       "'seek DATA' failed: Probably no __END__ or __DATA__ segment."; 
      $source = <DATA>; 
      seek DATA, $DATA_position, 0 or croak # Must leave *DATA usable. 
       "seek to reset DATA filehandle failed after read."; 
     }; 
     if ([email protected]) { 
      croak [email protected] if [email protected] =~ /reset/; # Unstable state: Shouldn't be possible. 
      eval { 
       require FindBin; 
       no warnings 'once'; 
       open my $source_fh, $FindBin::Bin . '/' . $0 or croak $!; 
       $source = <$source_fh>; 
      }; 
      croak "Couldn't read source file from *DATA or \$0: [email protected]" if [email protected]; 
     } 
     return $source; 
    } 
}; 

print read_source(), "\n"; 

Este fragmento intenta leer desde DATA, lo que elimina la necesidad de cargar FindBin y abrir un nuevo identificador de archivo en primer lugar. Si eso falla, entonces prueba el enfoque FindBin. Si ambos fallan, arroja una excepción. El estado final exitoso sorbe todo el archivo fuente en $source_code.El identificador DATA también se restaurará al mismo estado en que se encontraba antes de llamar a este fragmento.

Eso debería manejar de forma robusta la cuestión de cómo leer el archivo de origen sin recurrir a un filtro de origen.

2

¿Está viendo esto en el depurador Perl? Es probable que de dónde provienen las entradas de la tabla de símbolos: vea DATA STRUCTURES MAINTAINED BY CORE section of the perldoc in your perl5db.pl file.

La única manera que puedo ver para conseguir la entrada _<- en la tabla de símbolos es comenzar Perl simplemente con el interruptor -d y luego entrar en un programa de Perl en la entrada estándar, por ejemplo:

$ perl -d 

Loading DB routines from perl5db.pl version 1.32 
Editor support available. 

Enter h or `h h' for help, or `man perldebug' for more help. 

print "Hello world\n"; 
<Ctrl-D> 
main::(-:1): print "Hello world\n"; 
    DB<1> 

A partir de aquí, @{"_<-"} (o @{$main::{"_<-"}}) contiene su entrada, ${"_<-"} o ${$main::{"_<-"}} contiene el "nombre" de su archivo (solo -) y %{"_<-"}/%{$main::{"_<-"}} contiene información sobre puntos de interrupción y acciones para recorrer el código desde la entrada estándar.

Sin strict refs, también se puede ver esta información con algo como

DB<6> $name="_<-" 

    DB<7> p ${$name} 
- 
    DB<8> p @{$name} 
BEGIN { require 'perl5db.pl' }; 
print "Hello world\n"; 

    DB<9> p %{$name} 

No hay gestor de archivo asociado a la entrada de la tabla de símbolos para _<- (o para cualquier otro _<... símbolos).

+0

Ah, la búsqueda de la parte superior del archivo es interesante. ¿Se puede hacer esto en la fase de compilación? – Axeman

Cuestiones relacionadas