2010-08-22 16 views
12

No puedo evaluar el código 'moderno perl' dentro del depurador Perl. Funciona bien al depurar el código en un archivo, pero no desde el prompt.¿Cómo usar las características de Perl 5.10 dentro del depurador?

ejemplo mínimo:

# activating 5-10 features with -E (it works) 
$ perl -E 'say "x"' 
x 
 
# calling the debugger with -E 
# it works for infile code but for prompt line code... 
$ perl -dEbug Loading DB routines from perl5db.pl version 1.33 
    DB say "x" 
    String found where operator expected at (eval 16)[/local-perl/lib/5.12.1/perl5db.pl:638] line 2, near "say "x"" 
    at (eval 16)[/local-perl/lib/5.12.1/perl5db.pl:638] line 2 
     eval '([email protected], $!, $^E, $,, $/, $\\, $^W) = @saved;package main; $^D = $^D | $DB::db_stop;say "x"; 

[Nota: lo mismo sucede con el "uso de las funciones ': 5.10'"]

Me estoy perdiendo algo?

Respuesta

7

Esta es una pregunta interesante, y una que nunca pensé, así que felicitaciones por eso.

He encontrado una referencia al problema here, pero tiene aproximadamente un año de antigüedad. Sin embargo, la parte relevante de la fuente perl no ha cambiado desde entonces, y se puede ver here. En esencia, si se echa un vistazo a toke.c en la fuente del Perl, que vea lo siguiente:

if (PL_perldb) { 
    /* Generate a string of Perl code to load the debugger. 
    * If PERL5DB is set, it will return the contents of that, 
    * otherwise a compile-time require of perl5db.pl. */ 

    const char * const pdb = PerlEnv_getenv("PERL5DB"); 
      ... 
} 
... 
if (PL_minus_E) 
    sv_catpvs(PL_linestr, 
      "use feature ':5." STRINGIFY(PERL_VERSION) "';"); 

Básicamente, el depurador se carga antes de se procesa la bandera -E, por lo que las características aún no está habilitado cuando el depurador se carga. La esencia de esto es que actualmente no puede usar -E con el comando -d. Si desea utilizar say, switch, o cualquier otra característica de la línea de depuración, usted tiene que hacerlo de esta manera:

DB<1> use feature 'say'; say "x" 
    x 

Lo más cerca que he visto a una solución es:

  1. copie perl5db.pl desde su PERL5LIB a alguna parte en PERL5LIB o al directorio actual, con un nombre diferente, digamos myperl5db.pl
  2. Edite myperl5db.pl para que tenga la función de uso ': 5.10'; (o simplemente 'declara', o simplemente 'di') en la primera línea.
  3. Establecer la variable de entorno PERL5DB a "begin {requerir 'myperl5db.pl'}"

Qué he encontrado en PerlMonks.

+0

Hummm, gracias por su respuesta, explica por qué sucede. Pero ahora estoy más perplejo: lo intenté antes de cargar estas funciones en el depurador con 'use feature' say '' y esto no funcionó. Ahora vi el truco: debería estar en la misma línea. ¿¿¿Por qué??? ¿Por qué el módulo 'feature' exporta las funciones localizadas al alcance actual (la línea DB)? ¿Cómo 'usar' puede hacer eso? Pensé que siempre era global. Si querías algo localizado, usa 'requiere' ¿no es así ?. Agradecería cualquier aclaración sobre este tema. –

+1

Pensé que era inusual, también. Para ser sincero, no estoy muy seguro de la parte de "por qué", pero parece que estás absolutamente en lo cierto: las sentencias 'use feature x' actúan como si estuvieran en el alcance de la línea DB. Supongo que cada línea se ejecuta como un bloque/alcance diferente, porque declarar una variable como 'my $ x = 1' también hará que' $ x' no esté disponible en las líneas siguientes (ya que no está en el alcance de la siguiente línea, solo la línea actual). Esto sería coherente, ya que los pragmas (como 'feature') tienen un alcance léxico al final del bloque en el que los usa. – eldarerathis

+0

gracias, me perdí el alcance léxico 'característica'. Esto explica la 'acción solo en la línea'. ¿Pero sabes por qué si mi módulo o script comienza con la función 'use' tampoco funciona?¿Significa que sucedería con todas las 'características de uso ...' ?. Y finalmente, si está utilizando las características perl> 5.10, en su secuencia de comandos, ¿cómo las depura cuando la línea tiene un error y desea jugar con ella en el depurador? ¿Usarías Devel :: REPL para jugar con él? –

Cuestiones relacionadas