Formato de salida de Perl

Perl es un lenguaje de procesamiento de datos de texto muy potente.

En Perl se puede usar `format` para definir una plantilla, y luego usar `write` para generar datos según la plantilla especificada.

La sintaxis de definición de formato en Perl es la siguiente:

format FormatName =
fieldline
value_one, value_two, value_three
fieldline
value_one, value_two
.

Análisis de parámetros:

  • FormatName: nombre del formato.
  • fieldline: una línea de formato, que se usa para definir el formato de una línea de salida, con caracteres como @, ^, <, >, |.
  • value_one,value_two……: línea de datos, que se usa para insertar valores en la línea de formato anterior; son variables de Perl.
  • .: símbolo de terminación.

A continuación se muestra un ejemplo simple de formato:

Ejemplo

#!/usr/bin/perl $text = "google ejemplo taobao"; format STDOUT = first: ^<<<<< # Alinear a la izquierda, longitud de carácter 6 $text second: ^<<<<< # Alinear a la izquierda, longitud de carácter 6 $text third: ^<<<< # Alinear a la izquierda, longitud de carácter 5, la última 'o' de 'taobao' se truncó $text . write

El resultado de ejecutar el ejemplo anterior es:

first: google
second: ejemplo
third: taoba

Sintaxis de línea de formato (línea gráfica)

  • Las líneas de formato comienzan con @ o ^; estas líneas no realizan ningún tipo de sustitución de variables.
  • El campo @ (no confundir con el símbolo de matriz @) es un campo normal.
  • Las longitudes de <, >, | después de @, ^ determinan la longitud del campo. Si la variable excede la longitud definida, se truncará.
  • <, >, | también indican respectivamente alineación a la izquierda, alineación a la derecha y alineación centrada.
  • El campo ^ se usa para rellenar bloques de texto de varias líneas.

Formato de campo

El formato de los campos se muestra en la siguiente tabla:

Formato Significado del campo
@<<< Salida alineada a la izquierda
@>>> Salida alineada a la derecha
@||| Salida centrada
@##.##   Número de precisión fija
@* Texto multilínea

El primer carácter de cada campo es el carácter de relleno de línea; cuando se usa el carácter @, no se aplica formato de texto.

En la tabla anterior, excepto el campo multilínea @*, el ancho del campo es igual al número de caracteres especificados, incluido el carácter @. Por ejemplo:

@###.##

Representa un ancho de siete caracteres, cuatro antes del punto decimal y dos después.

El ejemplo es el siguiente:

Ejemplo

#!/usr/bin/perl format EMPLOYEE = =================================== @<<<<<<<<<<<<<<<<<<<<<< @<< $name, $age @#####.## $salary =================================== . select(STDOUT); $~ = EMPLOYEE; @n = ("Ali", "Ejemplo", "Jaffer"); @a = (20,30, 40); @s = (2000.00, 2500.00, 4000.000); $i = 0; foreach (@n){ $name = $_; $age = $a[$i]; $salary = $s[$i++]; write; }

El resultado del ejemplo anterior es:

===================================
Ali                     20
  2000.00
===================================
===================================
Ejemplo                  30
  2500.00
===================================
===================================
Jaffer                  40
  4000.00
===================================

Variables de formato

  • $~ ($FORMAT_NAME): nombre del formato $^ ($FORMAT_TOP_NAME): almacena el nombre del formato de encabezado actual
  • $% ($FORMAT_PAGE_NUMBER): número de página actual de salida
  • $= ($FORMAT_LINES_PER_PAGE): número de líneas por página
  • $| ($FORMAT_AUTOFLUSH): si se debe vaciar automáticamente el búfer de salida
  • $^L ($FORMAT_FORMFEED): almacena la cadena que se debe generar antes del encabezado de cada página (excepto la primera)

A continuación se muestra un ejemplo simple de uso de $~ para formatear:

Ejemplo

#!/usr/bin/perl $~ = "MYFORMAT"; # Especifica el formato utilizado bajo la variable de archivo predeterminada write; # Genera el formato especificado por $~ format MYFORMAT = # Define el formato MYFORMAT ================================= Text # Tutorial para novatos ================================= . write;

El resultado de ejecutar el ejemplo anterior es:

=================================
      Text # Ejemplo
=================================
=================================
      Text # Ejemplo
=================================

Si no se especifica $~, se generará el formato llamado STDOUT:

Ejemplo

#!/usr/bin/perl write; # Si no se especifica $~, se buscará el formato llamado STDOUT format STDOUT= ~El texto especificado con el símbolo ~ no se generará ----------------STDOUTFormato ---------------- .

El resultado de ejecutar el ejemplo anterior es:

----------------
  STDOUT格式
----------------

En el siguiente ejemplo, demostramos el uso de las variables $^ o $FORMAT_TOP_NAME agregando información de encabezado al informe:

Ejemplo

#!/usr/bin/perl format EMPLOYEE = =================================== @<<<<<<<<<<<<<<<<<<<<<< @<< $name, $age @#####.## $salary =================================== . format EMPLOYEE_TOP = =================================== Name Age =================================== . select(STDOUT); $~ = EMPLOYEE; $^ = EMPLOYEE_TOP; @n = ("Ali", "Ejemplo", "Jaffer"); @a = (20,30, 40); @s = (2000.00, 2500.00, 4000.000); $i = 0; foreach (@n){ $name = $_; $age = $a[$i]; $salary = $s[$i++]; write; }

El resultado del ejemplo anterior es:

===================================
Name                    Age
===================================
===================================
Ali                     20
  2000.00
===================================
===================================
Ejemplo                  30
  2500.00
===================================
===================================
Jaffer                  40
  4000.00
===================================

También podemos usar $% o $FORMAT_PAGE_NUMBER para configurar la paginación del informe:

Ejemplo

#!/usr/bin/perl format EMPLOYEE = =================================== @<<<<<<<<<<<<<<<<<<<<<< @<< $name, $age @#####.## $salary =================================== . # Agregar paginación $% format EMPLOYEE_TOP = =================================== Name Age Page @< $% =================================== . select(STDOUT); $~ = EMPLOYEE; $^ = EMPLOYEE_TOP; @n = ("Ali", "Ejemplo", "Jaffer"); @a = (20,30, 40); @s = (2000.00, 2500.00, 4000.000); $i = 0; foreach (@n){ $name = $_; $age = $a[$i]; $salary = $s[$i++]; write; }

El resultado del ejemplo anterior es:

===================================
Name                    Age Page 1
===================================
===================================
Ali                     20
  2000.00
===================================
===================================
Ejemplo                  30
  2500.00
===================================
===================================
Jaffer                  40
  4000.00
===================================

Salida a otros archivos

De forma predeterminada, la función write envía el resultado al archivo de salida estándar STDOUT; también podemos hacer que lo envíe a cualquier otro archivo. El método más simple es pasar la variable de archivo como parámetro a write, por ejemplo:

write(MYFILE);

El código anterior usa el formato de impresión predeterminado llamado MYFILE para generar en el archivo MYFILE.

Pero así no se puede usar la variable $~ para cambiar el formato de impresión utilizado. La variable del sistema $~ solo afecta a la variable de archivo predeterminada; podemos cambiar la variable de archivo predeterminada, cambiar $~ y luego llamar a write.

Ejemplo

#!/usr/bin/perl if (open(MYFILE, ">tmp")) { $~ = "MYFORMAT"; write MYFILE; # Salida con variable de archivo; en este caso se imprime el formato con el mismo nombre que la variable, es decir, MYFILE. El valor especificado en $~ se ignora. format MYFILE = # Mismo nombre que la variable de archivo================================= Escrito en el archivo ================================= .close MYFILE; }

Después de una ejecución exitosa, podemos ver el contenido del archivo tmp, como se muestra a continuación:

$ cat tmp 
=================================
      输入到文件中
=================================

Al usar select para cambiar la variable de archivo predeterminada, esta devuelve la representación interna de la variable de archivo predeterminada actual, de modo que podemos crear subrutinas para generar según nuestras propias ideas sin afectar otras partes del programa.

Ejemplo

#!/usr/bin/perl if (open(MYFILE, ">>tmp")) { select (MYFILE); # Hace que la salida impresa de la variable de archivo predeterminada se dirija a MYFILE $~ = "OTHER"; write; # Variable de archivo predeterminada, imprime al archivo especificado por select; debe usar el formato OTHER especificado por $~ format OTHER= ================================= Salida al archivo usando el formato definido ================================= .close MYFILE; }

Después de una ejecución exitosa, podemos ver el contenido del archivo tmp, como se muestra a continuación:

$ cat tmp 
=================================
      输入到文件中
=================================
=================================
  使用定义的格式输入到文件中
=================================
Otras extensiones