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> $b = 0xFF0
  DB<3> p $a&$b
3840
  DB<4> p 0xF00
3840
  DB<5> $a = "AB"
  DB<6> $b = "AD"
  DB<7> p "B" & "D"
@
  DB<8> p $a & $b
A@

Casiano Rodríguez León
2010-03-03
">perlfaq6 Regexes
  • perlfaq7 Perl Language Issues
  • perlfaq8 System Interaction
  • perlfaq9 Networking
  • Los manuales de referencia se dividen por tópicos: Por último - solo para gurus - estan los documentos que describen las partes internas de Perl: La opción -l de perldoc permite ver en que directorio se encuentra la documentación:
    $ perldoc -l perlintro
    /usr/share/perl/5.8/pod/perlintro.pod
    
    Si se desea convertir desde pod a algún formato específico, por ejemplo a LATEX basta con usar el conversor adecuado:
    $ pod2latex -full `perldoc -l perlintro`
    $ ls -l perlintro.tex
    -rw-r--r-- 1 pp2 pp2 24333 2008-02-21 13:22 perlintro.tex
    $ pdflatex perlintro.tex
    This is pdfeTeX, Version 3.141592-1.30.5-2.2 (Web2C 7.5.5)
    entering extended mode
    ....................................................................
    $ ls -ltr *.pdf | tail -1
    -rw-r--r-- 1 pp2 pp2 191367 2008-02-21 13:22 perlintro.pdf
    
    En este caso hemos usado pod2latex. Para poder ejecutar la conversión de .pod a LATEX asegúrese de tener instalado el módulo Pod::LaTeX (puede obtenerlo desde CPAN).

    Lenguajes y Herramientas de Programacion 2011-02-02