7 votes

Je peux avoir un accès à la source ?

Il semble qu'il y ait un symbole dans main appelé '_<-' (sans les guillemets) de la même manière que les autres choses qui ressembler à ils pourraient être des poignées : '_</usr/perl/lib/Carp.pm' par exemple.

Y a-t-il un moyen de l'utiliser ?

Ou devrais-je utiliser un filtre de source si j'espère lire la source d'entrée ?


En réponse à mob : Je ne sais pas où Debug pourrait être activé. Après avoir vidé la table de base, une vidange de %INC montre :

$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'
    };

2voto

mob Points 61524

Vous voyez cela dans le débogueur perl ? C'est probablement de là que proviennent ces entrées dans la table des symboles : voir le fichier DATA STRUCTURES MAINTAINED BY CORE de la perldoc dans votre perl5db.pl fichier .

Le seul moyen que je vois pour obtenir le _<- dans la table des symboles est de démarrer perl avec seulement l'élément -d puis entrez un programme Perl dans l'entrée standard, par exemple :

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

D'ici, @{"_<-"} (ou @{$main::{"_<-"}} ) contient votre entrée, ${"_<-"} o ${$main::{"_<-"}} contient le "nom" de votre fichier (juste - ), et %{"_<-"} / %{$main::{"_<-"}} contient des informations sur les points d'arrêt et les actions permettant de parcourir le code à partir de l'entrée standard.

Sans strict refs vous pouvez également visualiser ces données avec quelque chose comme

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

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

  DB<9> p %{$name}

Il n'y a pas de fichier associé à l'entrée de la table des symboles pour _<- (ou pour tout autre _<... symboles).

2voto

DavidO Points 8694

Ou devrais-je utiliser un filtre de source si j'espère lire la source d'entrée ?

Si le fichier source a un __END__ o __DATA__ alors la balise DATA filehandle est disponible. ...en soi, c'est ennuyeux. Ce qui est intéressant, c'est que vous pouvez seek à la position 0, et cela vous amènera au début du fichier source :

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( !$@ ) {
    while(<DATA>){
        print;
    }
}
else {
    carp $@;
}

__END__

Ce script s'exécutera (en imprimant 'Just another Perl hacker,'), puis terminera en imprimant sa propre source.

Dans le code ci-dessus, si le eval piège une exception, la solution de repli pourrait consister à utiliser FindBin et $0 , ouvrez le fichier source, puis lisez-le. En assemblant le tout, voici à quoi cela ressemble :

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 ($@) {
            croak $@ if $@ =~ /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: $@" if $@;
        }
        return $source;
    }
};

print read_source(), "\n";

Cet extrait tente d'abord de lire les données de DATA ce qui élimine la nécessité de charger FindBin et d'ouvrir un nouveau gestionnaire de fichiers. Si cela échoue, il essaie alors l'approche FindBin. Si les deux échouent, il lève une exception. L'état final réussi fait glisser l'intégralité du fichier source dans le fichier $source_code . Le site DATA sera également restauré dans l'état dans lequel il se trouvait avant l'appel de ce snippet.

Cela devrait permettre de résoudre de manière robuste la question de la lecture du fichier source sans recourir à un filtre de source.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X