Use caracteres que no sean palabras como nombres de variables
Utilizando $%
en lugar de $a
se permitirá colocar el nombre de la variable justo al lado de una if
, for
o while
construir como en:
@r=(1,2,3,4,5);$%=4;
print$_*$%for@r
Se pueden usar muchos, pero revisa los documentos y la respuesta de @ BreadBox para saber cuáles tienen efectos mágicos.
Use el mapa cuando no pueda usar modificadores de instrucciones
Si no puede usar modfiers de declaración según la respuesta de @ JB , el mapa puede guardar un byte:
for(@c){}
vs. map{}@c;
y es útil si desea hacer iteraciones anidadas, ya que puede colocar for
bucles postfix dentro de map
.
Usa todas las variables mágicas de Expresión Regular
Perl tiene variables mágicas para 'texto antes del partido' y 'texto después del partido', por lo que es posible dividirlo en grupos de dos con potencialmente menos caracteres:
($x,$y)=split/,/,$_;
($x,$y)=/(.+),(.+)/;
/,/; # $x=$`, $y=$'
# Note: you will need to save the variables if you'll be using more regex matches!
Esto también podría funcionar bien como un reemplazo para substr
:
$s=substr$_,1;
/./;# $s=$'
$s=substr$_,4;
/.{4}/;# $s=$'
Si necesita el contenido del partido, $&
se puede utilizar, por ejemplo:
# assume input like '10 PRINT "Hello, World!"'
($n,$c,$x)=split/ /,$_;
/ .+ /; # $n=$`, $c=$&, $x=$'
Reemplazar subs por nombres largos con un nombre más corto
Si llama por ejemplo print
cuatro o más veces en su código (esto obviamente varía con la duración de la rutina que está llamando), reemplácelo con un subnombre más corto:
sub p{print@_}p;p;p;p
vs.
print;print;print;print
Reemplazar incrementos / decrementadores condicionales
Si tienes un código como:
$i--if$i>0
puedes usar:
$i-=$i>0
en cambio para guardar algunos bytes.
Convertir a entero
Si no está asignando a una variable y no puede usar la sugerencia de breadbox , puede usar la expresión 0|
:
rand 25 # random float eg. 19.3560355885212
int rand 25 # random int
0|rand 25 # random int
rand 25|0 # random int
~~rand 25 # random int
Sin embargo, vale la pena señalar que no necesita usar un número entero para acceder a un índice de matriz:
@letters = A..Z;
$letters[rand 26]; # random letter
$_=print""
es más corto que$_=print$foo
.