Así que tengo una clase de Perl. Tiene un método sort()
, y yo quiero que sea más o menos idéntica a la incorporada en el sort()
función:Perl variable cuestión de alcance
$object->sort(sub ($$) { $_[0] <=> $_[1] });
Pero no puedo hacer:
$object->sort(sub { $a <=> $b });
Debido alcance. Pero el módulo List :: Util hace esto con reduce()
. Miré el módulo List :: Util, y hacen algunas cosas bastante desagradables con no strict 'vars'
para que esto suceda. Intenté eso, pero fue en vano.
Tengo entendido que reduce()
funciona de la forma en que lo hace porque se exporta al espacio de nombres apropiado, y por lo tanto mi clase no puede hacerlo ya que la función está firmemente en otro espacio de nombres. ¿Es correcto o hay alguna forma (indudablemente más espantosa y desaconsejable) de hacerlo en mi situación?
Eso puede ser lo suficientemente bueno para sus propósitos, pero es frágil. No hay garantía de que la función de comparación pertenezca al mismo paquete que la persona que llama del método 'sort'. Ahí es donde interviene Sub :: Identify. – cjm
@cjm - Esto es cierto, y definitivamente examinaré Sub :: Identify, pero mi mayor problema es hacerlo funcionar, en lugar de hacerlo funcionar en el caso general. Las soluciones específicas son mejores que las fallas generales. Sin embargo, combinar esta respuesta con la tuya me daría una solución general, que es algo bueno. –
Aunque resulta que el problema 'sort' tiene el mismo problema. Se supone que la función de comparación proviene del mismo paquete que la persona que llama. Entonces, si puedes vivir con eso, guardas una dependencia en Sub :: Identify. (O podría exigir condicionalmente Sub :: Identify, y recurrir a 'calller' si no está instalado. Pero eso es más trabajo.) – cjm