Ciò è probabilmente dovuto al metodo di essere ereditato da una classe base. Tuttavia, nelle situazioni estremamente strane, potrebbe anche essere iniettato dinamicamente nello spazio dei nomi del modulo, che è molto più difficile da capire.
È possibile trovare il proprio sub con la ricerca della forza bruta o calcolando la classe base di un modulo (e possibilmente più in alto nella catena di ereditarietà) e cercando solo il codice delle classi di base. Vi mostrerò come fare entrambe le cose:
ricerca forza bruta: Questa è probabilmente la soluzione più semplice in casi complicati in quanto il sub avrebbe potuto essere iniettato nel namespace del modulo in modo dinamico dal modulo non antenato e trovare i moduli degli antenati non è facile al 100% a causa di molteplici modi di definire l'ereditarietà che potrebbe essere stata utilizzata (utilizzare base, utilizzare padre, roba Moose, materiale AUTOLOADED)
Innanzitutto, scoprire quali altri moduli sono caricati con My :: Modulo
perl -e 'use My::Module::DB::raw_info; print "$INC{$_}\n" foreach keys %INC'
Ciò stamperà la posizione di tutti quei moduli
Poi, ricerca per la definizione sub in tutto ciò che il codice (il seguente dovrebbe essere tutto una riga, ho diviso in su per migliorare la leggibilità in 2 linee):
grep search_like
`perl -e 'use My::Module::DB::raw_info; print "$INC{$_}\n" foreach keys %INC'`
Se questo restituisce troppi risultati, modificare il grep per
grep "sub search_like"
`perl -e 'use My::Module::DB::raw_info; print "$INC{$_}\n" foreach keys %INC'`
questo vi troverà la definizione in qualsiasi modulo :: modulo :: DB :: raw_info eredita fro m senza analizzare effettivamente il codice del modulo per ereditarietà.
Ereditarietà:
Scopri padre del modulo utilizzando ISA
come segue:
perl -e 'use My::Module::DB::raw_info; print "@My::Module::DB::raw_info::ISA\n";'
Per chiarire, questo funziona solo per i moduli "classico ereditato" utilizzando @ISA
, roba non Moose . Inoltre, non funziona se la routine viene chiamata utilizzando AutoLoader o viene iniettata dinamicamente nella tabella dei simboli, il che può avvenire in qualsiasi codice, non necessariamente in quello principale.
anche "usa base ..." – Arkadiy
"extends" è una cosa Moose. =). –
non utilizzare la base; _; , usa genitore! –