Tienes razón, hay que ir paso a paso...
Pero
reverse() es una de las muchas funciones que tiene Perl y que está documentada. En concreto, dice:
This operator is also handy for inverting a hash, although there are some caveats. If a value is duplicated in the original hash, only one of those can be represented as a key in the inverted hash. Also, this has to unwind one hash and build a whole new one, which may take some time on a large hash, such as from a DBM file.
que se puede traducir por:
Este operador es también útil para invertir un hash, pero con algunas salvedades. Si un valor está duplicado en el hash original, solo uno de ellos será representado como una clave en el hash invertido. También, implica desplegar un hash y construir uno nuevo completo, algo que puede tomar algún tiempo en un hash grande, como en un fichero DBM.
Así que SÍ que está comentado en la documentación. El problema es ese: que la documentación es enorme.
Otra forma de hacerlo:
Using perl Syntax Highlighting
@rehash{ values %hash } = keys %hash;
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Aquí, vamos sacando las claves con keys() y las vamos guardando en el nuevo hash (que sabemos que lo es solo por la presencia de las llaves). Cada clave de %hash se guarda como valor de %rehash, asociada a una nueva clave que se extrae de los valores de %hash (con values()).
Perl garantiza que el orden de salida de las claves corresponde con el de los valores. Por eso la correspondencia es uno a uno.
Y como estamos manejando una lista de valores, hemos cambiado el
sigil '%' por '@'.