2010-09-09 11 views
13

La sección Overriding Built-in Functions de la documentación perlsub proporciona¿Qué incorporaciones de Perl no pueden anularse en CORE :: GLOBAL?

Hay un segundo método que a veces es aplicable cuando se desea sustituir un sistema incorporado en todas partes, sin tener en cuenta los límites de espacio de nombres. Esto se logra al importar un sub en el espacio de nombre especial CORE::GLOBAL::.

y luego da algunos ejemplos. Al final, sin embargo, es

Por último, algunos muebles empotrados (por ejemplo exists o grep) puede no ser anulados.

¿Cuál es la lista completa?

+0

Me alegra que haya preguntado esto porque estaba a punto de preguntarme, ya que tengo que escribir sobre esto para un libro. :) –

+0

@brian d foy Le enviaré mi factura. –

+0

Y pagaré cupones de cerveza canjeables en algún evento de Perl. :) Iba a intentar hacer esto con la fuerza bruta y solo ver de qué se quejaba Perl.Todavía podría hacer eso. –

Respuesta

14

Cualquier valor que sea negativo en toke.c puede anularse; todos los demás pueden no. Puede mirar el código fuente here.

Por ejemplo, veamos waitpid en la línea 10396:

case 'w': 
     if (name[1] == 'a' && 
      name[2] == 'i' && 
      name[3] == 't' && 
      name[4] == 'p' && 
      name[5] == 'i' && 
      name[6] == 'd') 
     {          /* waitpid */ 
     return -KEY_waitpid; 
     } 

Desde waitpid es negativo, puede ser anulado. ¿Qué hay de grep?

 case 'r': 
      if (name[2] == 'e' && 
       name[3] == 'p') 
      {         /* grep  */ 
      return KEY_grep; 
      } 

Es positivo, por lo que no se puede anular. Eso significa que las siguientes palabras clave no pueden ser anulados:

chop, defined, delete, do, dump, each, else, elsif, eval, exists, for, foreach, format, glob, goto, grep, if, keys, last, local, m, map, my, next, no, package, pop, pos, print, printf, prototype, push, q, qq, qw, qx, redo, return, s, scalar, shift, sort, splice, split, study, sub, tie, tied, tr, undef, unless, unshift, untie, until, use, while, y

+1

El enlace en el OP contiene un ejemplo específico de burking 'glob'. – mob

+3

Ese ejemplo lo hace al exportar un símbolo 'glob' al paquete que llama, sin reemplazar un símbolo en' CORE :: GLOBAL :: ' – friedo

+0

Debe haber algo de magia adicional:' chop' y 'splice' se pueden burlar. Creo que 'shift',' unshift', 'push' y' pop' también pueden. – mob

5

La función prototype le dirá si puede anular una función CORE::.

Aquí es un hackeado tratar de conseguir todas las funciones sin tener que escribirlas:

#!/usr/bin/perl 

use strict; 
use warnings; 

open my $fh, "-|", "perldoc", "-u", "perlfunc" or die $!; 
my %seen; 
while (<$fh>) { 
    next unless my ($func) = /=item ([a-z]\w+)/; 
    next if $seen{$func}++; 

    my $prototype = prototype "CORE::$func"; 

    print "$func is ", defined $prototype ? "overiddable with $prototype " : 
     "not overiddable", "\n"; 
} 
+3

Hay magia adicional que permite anular 'do',' require' y 'glob'. Ver 'perlsub' para el qué (si no el cómo y por qué). – mob

1

La función readline(HANDLE) (y el equivalente <HANDLE> me operador de E/S) puede ser burlado, pero su comportamiento de auto -assigning a $_ cuando se utiliza como

while (<HANDLE>) { ... # equivalent to while (defined($_=readline(HANDLE))) 

no puede ser. Vea el comentario de Hobbs en How can I still get automatic assignment to '$_' with a mocked 'readline' function?. Esto significa que un código como

while (<>) {  # implicitly sets $_ 
    do_something_with($_); 
} 

probablemente se romperá si se redefine readline.

Cuestiones relacionadas