Output berformat Perl


Perl ialah bahasa pemprosesan data teks yang sangat berkuasa.

Dalam Perl, anda boleh menggunakan format untuk menentukan templat, dan kemudian menggunakan tulis untuk mengeluarkan data mengikut templat yang ditentukan.

Sintaks definisi pemformatan Perl adalah seperti berikut:

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

Analisis parameter:

  • FormatName: Nama format.

  • garisan medan: Baris format yang digunakan untuk menentukan format baris output, dengan aksara seperti @,^,<,>,|.

  • value_one, value_two...: Baris data, digunakan untuk memasukkan nilai ke dalam baris format sebelumnya, semuanya adalah pembolehubah perl.

  • .: simbol tamat.

Berikut ialah contoh pemformatan mudah:

#!/usr/bin/perl

$text = "google php taobao";
format STDOUT =
first: ^<<<<<  # 左边对齐,字符长度为6
    $text
second: ^<<<<< # 左边对齐,字符长度为6
    $text
third: ^<<<< # 左边对齐,字符长度为5,taobao 最后一个 o 被截断
    $text  
.
write

Hasil keluaran untuk melaksanakan contoh di atas ialah:

first: google
second: php
third: taoba

Format baris (garis grafik) sintaks

  • Formatkan baris bermula dengan @ atau ^, baris ini tidak melakukan sebarang bentuk penggantian pembolehubah.

  • @ medan (jangan dikelirukan dengan simbol tatasusunan @) ialah medan biasa.

  • @,^ Panjang <, >,| menentukan panjang medan Jika pembolehubah melebihi panjang yang ditentukan, ia akan dipotong.

  • <, >,| juga mewakili penjajaran kiri, penjajaran kanan dan penjajaran tengah. Medan

  • ^ digunakan untuk mengisi blok teks berbilang baris.

Format medan nilai

Format medan nilai adalah seperti yang ditunjukkan dalam jadual berikut:

格式值域含义
@<<<左对齐输出
@>>>右对齐输出
@|||中对齐输出
@##.##  固定精度数字  
@*多行文本

Aksara pertama bagi setiap medan nilai ialah aksara pengisi baris Apabila aksara @ digunakan, tiada pemformatan teks dilakukan.

Dalam jadual di atas, kecuali medan nilai berbilang baris @*, lebar medan adalah sama dengan bilangan aksara yang ditentukan termasuk aksara @ Contohnya:

@###.##

bermaksud tujuh aksara lebar , empat titik perpuluhan sebelum dan dua titik perpuluhan selepas.

Contohnya adalah seperti berikut:

#!/usr/bin/perl

format EMPLOYEE =
===================================
@<<<<<<<<<<<<<<<<<<<<<< @<< 
$name $age
@#####.##
$salary
===================================
.

select(STDOUT);
$~ = EMPLOYEE;

@n = ("Ali", "php", "Jaffer");
@a  = (20,30, 40);
@s = (2000.00, 2500.00, 4000.000);

$i = 0;
foreach (@n){
	$name = $_;
	$age = $a[$i];
	$salary = $s[$i++];
	write;
}

Hasil keluaran contoh di atas ialah:

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

Pembolehubah format

  • $~ ($ FORMAT_NAME): nama format $^ ($FORMAT_TOP_NAME): Nama format pengepala semasa disimpan dalam

  • $% ($FORMAT_PAGE_NUMBER): Nombor halaman output semasa

  • $= ($FORMAT_LINES_PER_PAGE): Bilangan baris dalam setiap halaman

  • $| ($FORMAT_AUTOFLUSH): Sama ada hendak memuat semula storan penimbal output secara automatik

  • $^L ($FORMAT_FORMFEED): Rentetan yang perlu dikeluarkan sebelum pengepala setiap halaman (kecuali halaman pertama) disimpan dalam

Berikut adalah ringkas cara menggunakan $~ Contoh pemformatan:

#!/usr/bin/perl

$~ = "MYFORMAT"; # 指定缺省文件变量下所使用的格式
write;           # 输出 $~ 所指定的格式

format MYFORMAT = # 定义格式 MYFORMAT 
=================================
      Text # php中文网
=================================
.
write;

Hasil keluaran untuk melaksanakan contoh di atas ialah:

=================================
      Text # php中文网
=================================
=================================
      Text # php中文网
=================================

Jika $~ tidak dinyatakan, format bernama STDOUT akan menjadi output:

#!/usr/bin/perl

write;         # 不指定$~的情况下会寻找名为STDOUT的格式

format STDOUT =
~用~号指定的文字不会被输出
----------------
  STDOUT格式
----------------
.

Hasil output melaksanakan contoh di atas ialah:

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

Dalam contoh berikut, kami menunjukkan penggunaan pembolehubah $^ atau $FORMAT_TOP_NAME dengan menambah maklumat pengepala laporan:

#!/usr/bin/perl

format EMPLOYEE =
===================================
@<<<<<<<<<<<<<<<<<<<<<< @<< 
$name $age
@#####.##
$salary
===================================
.

format EMPLOYEE_TOP =
===================================
Name                    Age
===================================
.

select(STDOUT);
$~ = EMPLOYEE;
$^ = EMPLOYEE_TOP;

@n = ("Ali", "php", "Jaffer");
@a  = (20,30, 40);
@s = (2000.00, 2500.00, 4000.000);

$i = 0;
foreach (@n){
   $name = $_;
   $age = $a[$i];
   $salary = $s[$i++];
   write;
}

Hasil keluaran contoh di atas ialah:

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

Kita juga boleh menggunakan $% atau $FORMAT_PAGE_NUMBER untuk menetapkan paging untuk laporan:

#!/usr/bin/perl

format EMPLOYEE =
===================================
@<<<<<<<<<<<<<<<<<<<<<< @<< 
$name $age
@#####.##
$salary
===================================
.

# 添加分页 $% 
format EMPLOYEE_TOP =
===================================
Name                    Age Page @<
                                 $%
=================================== 
.

select(STDOUT);
$~ = EMPLOYEE;
$^ = EMPLOYEE_TOP;

@n = ("Ali", "php", "Jaffer");
@a  = (20,30, 40);
@s = (2000.00, 2500.00, 4000.000);

$i = 0;
foreach (@n){
   $name = $_;
   $age = $a[$i];
   $salary = $s[$i++];
   write;
}

Hasil output contoh di atas ialah:

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

Output ke fail lain

Secara lalai, fungsi tulis mengeluarkan hasil kepada fail output standard STDOUT. Kaedah yang paling mudah ialah menghantar pembolehubah fail sebagai parameter untuk ditulis, seperti:

write(MYFILE);

Kod di atas menulis output kepada fail MYFILE menggunakan format pencetakan lalai bernama MYFILE.

Tetapi dengan cara ini anda tidak boleh menggunakan pembolehubah $~ untuk menukar format cetakan yang digunakan. Pembolehubah sistem $~ hanya mempengaruhi pembolehubah fail lalai Kita boleh menukar pembolehubah fail lalai, menukar $~, dan kemudian memanggil tulis.

#!/usr/bin/perl

if (open(MYFILE, ">tmp")) {
$~ = "MYFORMAT";
write MYFILE; # 含文件变量的输出,此时会打印与变量同名的格式,即MYFILE。$~里指定的值被忽略。

format MYFILE = # 与文件变量同名 
=================================
      输入到文件中
=================================
.
close MYFILE;
}

Selepas pelaksanaan berjaya, kita boleh melihat kandungan fail tmp seperti yang ditunjukkan di bawah:

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

Apabila kita boleh menggunakan pilih untuk menukar pembolehubah fail lalai, ia mengembalikan perwakilan dalaman bagi pembolehubah fail lalai semasa, Dengan cara ini, kita boleh mencipta subrutin dan mengeluarkannya mengikut idea kita sendiri tanpa menjejaskan bahagian lain program.

#!/usr/bin/perl

if (open(MYFILE, ">>tmp")) {
select (MYFILE); # 使得默认文件变量的打印输出到MYFILE中
$~ = "OTHER";
write;           # 默认文件变量,打印到select指定的文件中,必使用$~指定的格式 OTHER

format OTHER =
=================================
  使用定义的格式输入到文件中
=================================
. 
close MYFILE;
}

Selepas pelaksanaan berjaya, kita boleh melihat kandungan fail tmp, seperti yang ditunjukkan di bawah:

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