Perl 形式の出力


Perl は非常に強力なテキスト データ処理言語です。

Perl では、format を使用してテンプレートを定義し、write を使用して指定されたテンプレートに従ってデータを出力できます。

Perl フォーマット定義の構文は次のとおりです:

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

パラメータ分析:

  • FormatName: フォーマット名。

  • フィールドライン: @、^、<、>、| などの文字を使用して、出力行の形式を定義するために使用される形式行。

  • value_one、value_two...: データ行。前のフォーマット行に値を挿入するために使用され、すべて Perl 変数です。

  • .: 終了記号。

以下は簡単な書式設定の例です:

#!/usr/bin/perl

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

上記の例を実行した出力結果は次のとおりです:

first: google
second: php
third: taoba

書式設定行 (グラフィック行) 構文

  • 書式設定行は @ または ^ で始まり、これらの行は次のようになります。フォーム変数の置換はありません。

  • @ フィールド (配列記号 @ と混同しないでください) は通常のフィールドです。

  • @,^ の後の <, >,| の長さによって、変数が定義された長さを超える場合、切り捨てられます。

  • <, >,| は、それぞれ左揃え、右揃え、中央揃えも表します。

  • ^ フィールドは、複数行のテキスト ブロックのパディングに使用されます。

値フィールドの形式

次の表に示す値フィールドの形式:

形式値フィールドの意味
@<<<左揃え出力
@>>>右揃え出力
@|||中央揃え出力
@##.## 固定精度数値
@ *複数行のテキスト

各値フィールドの最初の文字は行充填文字です。@ 文字が使用される場合、テキストの書式設定は行われません。

上記の表では、複数行の値フィールド @* を除き、フィールド幅は文字 @ を含む指定された文字数に等しくなります。例:

@###.##

は、小数点の前に 4 文字分の幅を意味します。小数点 2 以降は 4 です。

例は次のとおりです:

#!/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;
}

上記の例の出力結果は次のとおりです:

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

フォーマット変数

  • $~ ($FORMAT_NAME): フォーマット名 $^ ($FORMAT_TOP_NAME): 現在のヘッダー形式名が保存されます

  • $% ($FORMAT_PAGE_NUMBER): 現在の出力ページ番号

  • $= ($FORMAT_LINES_PER_PAGE): 各ページの行数

  • $| ($FORMAT_AUTOFLUSH): 出力バッファストレージを自動的に更新するかどうか

  • $^L ($FORMAT_FORMFEED): 各ページのヘッダーの前に出力する必要がある文字列 (最初のページを除く)

  • に保存されます

以下は $~ を使用したフォーマットの簡単な例です:

#!/usr/bin/perl

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

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

上記の例を実行した出力結果は次のとおりです:

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

$~ が指定されていない場合、STDOUT という名前の形式が出力されます:

#!/usr/bin/perl

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

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

上記を実行します。 例の出力結果は次のとおりです。

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

次の例では、レポート ヘッダー情報を追加することで $^ または $FORMAT_TOP_NAME 変数の使用を示します。

#!/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;
}

上記の例の出力結果は次のとおりです。 :

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

$% または $FORMAT_PAGE_NUMBER をレポート設定のページネーションとして使用することもできます:

#!/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;
}

上記の例の出力結果は次のとおりです:

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

他のファイルに出力

デフォルトでは、関数 write は結果を次の場所に出力します。標準出力ファイル STDOUT の他のファイルに結果を出力することもできます。最も簡単な方法は、次のように、ファイル変数を書き込みパラメータとして渡すことです。

write(MYFILE);

上記のコードは、MYFILE という名前のデフォルトの印刷形式を使用して、出力をファイル MYFILE に書き込みます。

ただし、この方法では、$~ 変数を使用して、使用される印刷形式を変更することはできません。システム変数 $~ はデフォルトのファイル変数にのみ影響します。デフォルトのファイル変数を変更し、$~ を変更して、write を呼び出します。

#!/usr/bin/perl

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

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

実行が成功すると、以下に示すように tmp ファイルの内容を表示できます:

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

select を使用してデフォルトのファイル変数を変更できる場合、現在のデフォルトのファイル変数の内部表現が返されるので、プログラムの他の部分に影響を与えることなく、サブルーチンを作成し、独自のアイデアに従って出力できます。

#!/usr/bin/perl

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

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

実行が成功すると、以下に示すように tmp ファイルの内容を表示できます。