Introducción
Si conoces C, estas funciones te van a parecer bastante similares, pero hay algunas pocas diferencias.
El printf() lo usamos para poder formatear valores y datos de la manera que nosotros queramos.
printf() y sprintf()
Estas dos funciones son iguales, la diferencia es que printf envía su resultado a un objeto de archivo, mientras que sprintf regresa una cadena del resultado del printf.
La función printf esta puesto para imprimir el resultado en STDOUT, si quieres especificar otro objeto lo debes de hacer de la siguiente manera:
printf([OBJETO] FORMATO, VALORES);
Esto imprimirá el resultado al objeto OBJETO.
En cambio sprintf lo usaríamos de la siguiente manera:
my $variable = sprintf(FORMATO, VALORES);
El Formato
El FORMATO es una cadena que tendrá ciertas "expresiones" que describirán como deberá perl ordenar y desplegar los valores que pongas en VALORES. Cada una de estas "expresiones" empieza con un símbolo de %.
Una cadena de FORMATO típica se podría ver de la siguiente manera:
Mi número es: %d
Aquí el %d es una expresión que significa "un número", por lo que perl lo remplazaría por algún número decimal. Por ejemplo podrías decir lo siguiente:
printf("Mi número es: %d", $decimal)
Así que el %d en esta función es remplazado por el valor de la variable $decimal. Puedes poner tantas "expresiones" como quieras en FORMATO, con el mismo número de VALORES. Por ejemplo:
printf("%d %s %f", $decimal, $cadena, $flotante);
"Expresiones" en el FORMATO
Aquí esta el listado de "expresiones" que podemos usar en nuestra cadena de FORMATO.
%% Imprime un signo de %.
%c imprime un carácter con el código ASCII dado (con 66 imprime B, por ejemplo).
%s una cadena
%d un decimal
%u un decimal negativo o positivo sin signo
%o un integral en octal
%x un integral en hexadecimal
%e un número con punto flotante en notación científica
%f un número con punto flotante en notación decimal
%g puede ser %e ó %f, lo que decida printf que es lo mejor
%X lo mismo que %x pero con mayúsculas
%E como %e pero con 'E' mayúscula
%G lo mismo que %E cuando se usa notación científica
%p un "pointer"; imprime la locación en memoria de una variable en hexadecimal
%n imprime la cantidad de caracteres desplegados hasta el momento
Otras "expresiones" que existen por compatibilidad:
%i lo mismo que %d
%D lo mismo que %ld (decimal largo)
%U lo mismo que %lu (decimal largo sin signo)
%O lo mismo que %lo (octal largo)
%F lo mismo que %f
Especificadores de FORMATO
Cada uno de los especificadores que vienen abajo son opcionales y deben de usarse en el orden que aparecen aquí. Si esto se te hace muy confuso te recomiendo que pases a la siguiente sección, pues esto es simplemente para referencia.
% - El signo de porcentaje. requerido (lógicamente)
0 o más de los siguiente especificadores:
'#' (símbolo de gato): Especifica que el valor debe de ser convertido a una "forma alterna". Esto no tiene ningún efecto en 'c', 'd', 'i', 'n', 'p', 's', y la expresión 'u'. Para la expresión 'o' (octal), esto pone un '0' al principio. Para 'x' y 'X' (hexadecimal), 0x ó 0X es puesto al principio. Para 'e', 'E', 'f', 'g' y 'G', el valor es puesto siempre con un punto decimal (.) al principio, inclusive cuando no hay nombres. Para 'g' y 'G', los ceros al final no son removidos.
printf("%x", 10); # imprime 'a', mientras:
printf("%#x", 10); # imprime '0xa'
'0' (cero): Para quitar el padding de un número. El número es convertido a un número con la cantidad 0 necesarios a la derecha.
printf("%03d", 7); # imprime '007'
printf("%03d", 153); # imprime '153'
'-' (menos): Especifica que el valor será ajustado a la derecha, mientras que normalmente es hacia la izquierda.
printf("%5s", 'foo'); # imprime ' foo'
printf("%-5s", 'foo'); # imprime 'foo '
' ' (un espacio): Especifica que un espacio debe de dejarse antes de un número positivo.
printf("% d", 7); # imprime ' 7'
printf("% d", -7); # imprime '-7'
'+' (signo de más): Especifica que este valor siempre debe de ponerse antes del valor.
printf("%+d", 7); # imprime '+7'
. (un punto) El punto de precisión seguido de un número especifica la cantidad de números que se deben de imprimir para 'd', 'i', 'o', 'u', 'x', y expresiones 'X'. Para expresiones 'e', 'E', y 'F', es el número de dígitos que se deben de mostrar después del número decimal. Para 'g' y 'G' el número máximo de caracteres significativos. Para la expresión de cadena 's', es el máximo número de caracteres que se deben de desplegar.
printf("%.3d", 7); # imprime '007'
printf("%.2f", 3.66666); # imprime '3.66'
printf("%.3s", 'foobar'); # imprime 'foo'
Poniendo espacios
Si quieres alinear varias líneas de datos para un reporte, puedes especificar un ancho de campo en el cual los VALORES serán alineados a la derecha con los espacios necesarios.
Por ejemplo:
printf("%6s", 'foo'); # prints ' foo'
Aquí pone 3 espacios al principio para llenar el espacio de 6 caracteres que se específico.
Si quieres alinear todo a la izquierda todo lo que tienes que hacer es poner un signo de "-" antes del ancho. Por ejemplo:
printf("%-6s", 'foo'); # prints 'foo '
Modificadores de preescisión
El modificador de preescisión le dice a printf() cuantos caracteres se deben de desplegar después del punto decimal. Si hay más números de los que especificaste después del punto, el número es redondeado, si hay menos, se usan 0 para llenar el espacio:
printf("%.2f", 9.333333); # imprime '9.34'
printf("%.2f", 9); # imprime '9.00'
Para valores decimales, el modificador de preescisión tiene el mismo efecto con los '0' que se describió antes:
printf("%.3f", 7); # imprime 007
Para valores de cadena, tiene el efecto de especificar un tamaño de campo máximo, donde se imprimirán los primeros n número de caracteres de la cadena:
printf("%.3s", 'foobar'); # imprime 'foo'
printf("%.10s", 'foobar'); # imprime 'foobar'
printf("%5.5s %5.5s", 'foobar', 'baz'); # imprime 'fooba baz'
Redondeando número con sprintf()
¿Necesitas redondear un número decimal? o ¿redondear un número hasta un lugar del decimal? con sprintf() tienes la habilidad de hacer eso:
# da un valor de '3' a $foo
$foo = sprintf("%d", 3.14);
# da un valor de '7.3531' a $bar
$bar = sprintf("%.4f", 7.35309);
En la primera variable con %d convertimos el número decimal a un integral.
En la segunda variable con %.4f convierte un valor a un número con punto flotante con preescisión de 4 lugares decimales, redondeando el número como sea necesario.
Octal y Hexadecimal
Puedes convertir tus valores decimales a valores hexadecimales y octales usando el printf() y sprintf(). Usando las expresiones o de octal, x de hexadecimal y X de hexadecimal en mayúsculas:
printf("%x", 15); # imprime 'f'
printf("%X", 15); # imprime 'F'
printf("%o", 15); # imprime '17'
Ahora, como vimos en la sección de los especificadores de FORMATO, usando el símbolo de gato (#), perl convierte el valor a una "forma alternativa". Para %x y %X, pondrá al inicio el '0x' y '0X' respectivamente. Para %o una '0' al principio es agregado.
printf("%#x", 15); # imprime '0xf'
printf("%#o", 15); # imprime '017'
printf("%#4x", 15); # imprime ' 0xf'