Contexos Numérico y de Cadena: Conversiones

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 == 291
La 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 0
Es 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@



Subsecciones
Casiano Rodríguez León
Licencia de Creative Commons
Principios de Programación Imperativa, Funcional y Orientada a Objetos Una Introducción en Perl/Una Introducción a Perl
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=43.
2012-06-19