2010-03-29 17 views
9

Como dice el título, no tengo claro cuándo se convocará dicha subrutina. Desde la página require en perldoc uno puede escribir:¿Cuándo se llama a una referencia de subrutina en @INC?

push @INC, \&my_sub; 
sub my_sub { 
    my ($coderef, $filename) = @_; # $coderef is \&my_sub 
    ... 
} 

pero ¿dónde ir este exactamente? ¿El paquete requerido o el guión requerido (o paquete)? He intentado ambos con algunas declaraciones centinela print, pero ninguno de los dos funcionó tan claramente que hay algo que no entiendo.

Respuesta

12

Perl llama a una referencia de subrutina en @INC cuando atraviesa @INC para buscar un módulo. Es decir, lo activará cuando intente cargar un módulo con use o require y Perl no encontrará ese módulo en las ubicaciones anteriores de @INC.

BEGIN { 
    push @INC, 
     sub { print "Oops: There was an error looking for $_[1]\n"; }; 
    } 

eval "use Cat::Burglar"; 
eval "use Local::NotThere"; 
require Cat::Burglar; 

es necesario asegurarse de que su referencia subrutina está en @INC antes de intentar cargar los módulos. Recuerde que use es una característica de tiempo de compilación y que require es una característica de tiempo de ejecución. Al igual que con la adición de otras entradas "regulares" @INC, probablemente desee hacerlo en un bloque BEGIN tan pronto como sea posible en su programa.

+1

¡Guau, de alguna manera he leído los documentos 'require()' muchas veces sin darme cuenta de esta característica! – Ether

+1

No sé los documentos de memoria. Solo sé cómo googlear. –

1

Para no confundir nuestra subrutina con las subrutinas en los módulos estándar de Perl, generalmente es bueno usar el unshift en lugar de push. Por lo tanto, primero usará su subrutina desde el @INC.

+0

Creo que debería leer algo así como "Para * preferir * nuestra rutina secundaria con los módulos de carga de los módulos perl estándar" – justintime

+0

¡Sí! Usted es correcto justintime. Lo siento por mi Inglés – thillaiselvan

+1

Qué operación de matriz que utiliza depende de lo que está haciendo y cuando quiere la referencia de código para desencadenar. unshift lo coloca al frente de la matriz, empuja hacia el final y el empalme lo colocará en la posición que desee. Sin embargo, depende de la tarea. –

Cuestiones relacionadas