Quindi ho una classe Perl. Ha un metodo di sort()
, e voglio che sia più o meno identico a quello incorporato in sort()
funzione:Domanda per ambito variabile Perl
$object->sort(sub ($$) { $_[0] <=> $_[1] });
Ma io non posso fare:
$object->sort(sub { $a <=> $b });
A causa di scoping. Ma il modulo List :: Util fa questo con reduce()
. Ho esaminato il modulo List :: Util, e fanno cose piuttosto brutte con no strict 'vars'
per far sì che ciò accada. Ci ho provato, ma senza risultato.
È a mia conoscenza che reduce()
funzioni come funziona perché viene esportato nello spazio dei nomi appropriato, pertanto la mia classe non può farlo poiché la funzione è abbastanza saldamente in un altro spazio dei nomi. È corretto, o c'è un modo (indubbiamente più odioso e sconsiderato) di farlo nella mia situazione?
Potrebbe essere sufficiente per i tuoi scopi, ma è fragile. Non c'è alcuna garanzia che la funzione di confronto appartenga allo stesso pacchetto del chiamante del metodo 'sort'. Ecco dove arriva Sub :: Identify. – cjm
@cjm - Questo è vero, e cercherò sicuramente in Sub :: Identify, ma il mio problema più grande è farlo funzionare, piuttosto che farlo funzionare nel caso generale. Le soluzioni specifiche sono migliori dei guasti generali. Tuttavia, combinare questa risposta con la tua mi darebbe una soluzione generale, che è una buona cosa. –
Anche se il builtin 'sort' ha lo stesso problema. Si presuppone che la funzione di confronto provenga dallo stesso pacchetto del chiamante. Quindi se puoi conviverci, si salva una dipendenza su Sub :: Identify. (Oppure potresti richiedere Sub :: Identify condizionatamente e tornare a 'caller' se non è installato. Ma è più lavoro.) – cjm