Perl convierte automáticamente los valores de su representación numérica a su representación como cadena. Por ejemplo, si una cadena aparece al lado de un operador numérico como '+', Perl convierte la cadena a un número, antes de proceder a la evaluación de la expresión aritmética. Los contextos en los que se espera una cadena se denominan contextos de cadena. Aquellos en los que se esperan números se denominan contextos numéricos.
La función utilizada internamente por Perl para convertir implícitamente números a cadenas es la función de la librería estandard C sprintf. Análogamente, la función C usada para convertir cadenas a números es atof. Los espacios en blanco iniciales se ignoran. La conversión utiliza la parte inicial que parezca un número y el resto se ignora.
$n = 0 + "123"; # contexto numérico $n == 123 $n = 0 + "123xyz"; # contexto numérico $n == 123 $n = 0 + "\n123xyz"; # contexto numérico $n == 123 $n = 0 + "x123xyz"; # no hay número al comienzo $n == 0
El proceso de conversión no reconoce números octales ni hexadecimales. Para convertirlos deberá usarse explícitamente el operador oct:
$n = 0 + "x123"; # no hay número al comienzo $n == 0 $n = 0 + oct("x123"); # $n == 291La llamada
oct expresión
devuelve el valor decimal de expresion
,
interpretado como una cadena octal. Si la expresion
comienza con 0x
,
la interpreta como una cadena hexadecimal.
Los operadores de bit (como &
, |
, etc.)
son sensibles al contexto. Si es un contexto de cadena,
utilizan como unidad el carácter, mientras que si
es un contexto numérico, la unidad es el bit.
Veamos un ejemplo. Para ello usaremos el depurador de Perl que se activa usando la
opción -d
:
~/perl/src> perl -de 0Es necesario facilitarle al depurador un programa. Para evitar la molestia de escribir uno, le indicamos que le pasamos el programa en la línea de comandos. Esto se hace con la opción
-e
, que debe ir seguida del
programa Perl. En el ejemplo que sigue hemos elegido pasarle como programa uno bastante trivial:
una expresión que es la constante cero:
lhp@nereida:~/Lperl/doc$ perl -de 0 Loading DB routines from perl5db.pl version 1.28 Editor support available. Enter h or `h h' for help, or `man perldebug' for more help. main::(-e:1): 0 DB<1> $a = 0xF0F DB<2> printf "%b", 0xF0F 111100001111 DB<3> $b = 0xFF0 DB<4> p $a&$b 3840 DB<5> p 0xF00 3840 DB<6> $a = "AB" DB<7> $b = "AD" DB<8> p "B" & "D" @ DB<9> printf "%b", ord("B") 1000010 DB<10> printf "%b", ord("D") 1000100 DB<11> print chr(ord("B") & ord("D")) @ DB<12> p $a & $b A@