warning the standard reconfigure locales lc_ctype lc_all falling cannot perl variables built-in

perl - the - set locale ubuntu 16



¿Cómo-$ | trabajar en perl? (4)

Recientemente encontré esta manera para filtrar cada segundo valor de una lista:

perl -E ''say grep --$|, 1..10'' 13579

¿Como funciona?


¡Decir ah! $| cambia entre los valores de cero (falso, en perl) y uno (verdadero) cuando está "predecrementado"; solo puede contener esos valores.

Por lo tanto, su criterio de grep cambia en cada paso, se hace verdadero, falso, verdadero, falso, etc. y, por lo tanto, devuelve todos los demás elementos de la lista.

Demasiado inteligente por la mitad.


El punto es que este uso es solo un truco desagradable.
$| (o su alias más legible $OUTPUT_AUTOFLUSH ) es una variable especial para controlar el arranque automático de STDOUT (o el identificador de archivo seleccionado actualmente). Por lo tanto, solo acepta verdadero ( 1 ) o falso ( 0 ).


$| Solo puede ser cero o uno. El valor predeterminado es 0 , por lo que al disminuirlo antes de grep el 0º índice será uno.

Los decrementos subsiguientes en realidad lo "cambiarán" de cero a uno a cero y así sucesivamente.


$| es una variable especial de Perl que solo puede tener los valores 0 y 1. Cualquier asignación a $| de un verdadero valor distinto de cero, como

$| = 1; $| = ''foo''; $| = "4asdf"; # 0 + "4asdf" is 4 $| = /@a;

Tendrá el efecto de establecer $| a 1. Cualquier asignación de un valor de falso cero.

$| = 0; $| = ""; $| = undef; $| = "erk"; # 0 + "erk" is 0

establecerá $| a 0

Expandir --$| a $| = $| - 1 $| = $| - 1 $| = $| - 1 , y ahora puedes ver lo que está pasando. Si $| originalmente era 1, entonces --$| cambiará el valor a 0. Si $| originalmente era 0, entonces --$| intentará establecer el valor en -1, pero en realidad establecerá el valor en 1.