2012-08-03 11 views
7

Sembra che ci sia un simbolo nel principale chiamato '_<-' (senza le virgolette) nello stesso modo delle altre cose che sembrano che potrebbero essere le maniglie: '_</usr/perl/lib/Carp.pm', ad esempio.Posso ottenere un handle per - source?

C'è un modo per usarlo?

Oppure dovrei utilizzare un filtro di origine se spero di leggere la sorgente di input?


In risposta al mob: non so dove Debug si accende. Dopo aver scaricato la tabella di base, viene visualizzato un dump di% 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

Ho aggiornato la mia risposta per mostrare come leggere il file sorgente senza un filtro di origine in un modo che funzioni indipendentemente dal fatto che il file di origine abbia un segmento '__DATA__'. – DavidO

+0

Grazie, @DavidO. Metterò alla prova come funziona alla compilazione. – Axeman

+0

Solo dopo alcuni giorni dopo per vedere se la soluzione che ho fornito ha funzionato per voi. – DavidO

risposta

2

Oppure dovrei utilizzare un filtro di origine se spero di leggere la sorgente di input?

Se il file sorgente ha un tag __END__ o __DATA__, allora il filehandle DATA è disponibile. ... che di per sé è noioso. La cosa interessante è che si può seek in posizione 0, e che vi porterà alla parte superiore del file di origine:

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__ 

Questo script eseguirà (stampa 'solo un altro hacker Perl,'), e poi si concluderà fino a stampare la propria fonte.

Nel codice sopra riportato, se il blocco eval intercetta un'eccezione, il fallback potrebbe essere utilizzare FindBin e $0, aprire il file di origine e quindi leggerlo. Mettere tutto insieme, ecco come appare:

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

Questo frammento prima tenta di leggere da DATA, che elimina la necessità di caricare FindBin e aprire un nuovo handle di file. Se fallisce, prova l'approccio di FindBin. Se entrambi falliscono, lancia un'eccezione. Lo stato finale riuscito raccoglie l'intero file sorgente in $source_code.Anche l'handle DATA verrà ripristinato nello stesso stato in cui si trovava prima di chiamare questo snippet.

Questo dovrebbe risolvere la questione di come leggere il file sorgente senza ricorrere a un filtro di origine.

2

Questo si vede nel debugger perl? È probabile che queste voci di tabella dei simboli provengano: vedere lo DATA STRUCTURES MAINTAINED BY CORE section of the perldoc in your perl5db.pl file.

L'unico modo che posso vedere per ottenere l'ingresso _<- nella tabella dei simboli è quello di iniziare Perl con il solo interruttore -d e poi entrare in un programma Perl in standard input, ad esempio:

$ 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> 

Da qui, @{"_<-"} (o @{$main::{"_<-"}}) contiene l'input, ${"_<-"} o ${$main::{"_<-"}} contiene il "nome" del file (solo -), e %{"_<-"}/%{$main::{"_<-"}} detiene informazioni su punti di interruzione e le azioni per il passo del codice dallo standard input.

Senza strict refs, si potrebbe anche vedere queste informazioni con qualcosa di simile

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

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

    DB<9> p %{$name} 

Non c'è filehandle associato alla voce simbolo tavolo per _<- (o per qualsiasi altro _<... simboli).

+0

Ah, la ricerca della parte superiore del file è interessante. Questo può essere fatto nella fase di compilazione? – Axeman

Problemi correlati