Tengo algunos archivos perl que han sido "blanqueados" (no sé si fue de ACME :: Bleach, o algo similar). Al no ser muy fluido en Perl, me gustaría entender lo que el de una sola línea que se inicia el archivo hace para decodificar el espacio en blanco que sigue:¿Qué hace esta línea perl de un archivo "blanqueado"?
$_=<<'';y;\r\n;;d;$_=pack'b*',$_;$_=eval;[email protected]&&[email protected];$_
El resto del archivo está espacios en blanco, y el archivo se ejecutable por sí mismo (se coloca en un directorio/bin).
[Solución], gracias a @JB.
La parte pack
de esto parece ser la más compleja, y me tomó un tiempo darme cuenta de lo que estaba pasando. El paquete toma el LSB solo de cada 8 caracteres y lo descomprime como un personaje big-endian en binario. Las pestañas se convierten en '0's, y los espacios se convierten en' 1's.
'\t\t \t ' => '#'
in binary:
00001001 00001001 00100000 00100000 00100000 00001001 00100000 0100000
every LSB:
1 1 0 0 0 1 0 0
convert from from big-endian format:
0b00100011 == 35 == ord('#')
OK, creo que es la función 'pack' la que me está molestando. ¿Puedes aclarar cómo algo como ''\ t \ t \ t' 'se traduce en'' # ''? – JimB
Lo sentimos, parece que los caracteres sin procesar todavía tienen espacios colapsados, esa cadena debe ser 'pestaña tab sp sp sp tab sp sp sp sp'. – JimB
'tab' es' chr (9) ', impar; 'sp' es' chr (32) ', incluso. Así que su cadena se traduce en la secuencia de bits 1, 1, 0, 0, 0, 1, 0, 0, 0, que (LSB primero) es 0x23, el código ASCII para ''#''. (tiene un bit adicional) –