Perl フォーマット出力

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

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

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

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

パラメータの説明:

  • FormatName:フォーマット名。
  • fieldline:出力行の形式を定義するフォーマット行です。@,^,<,>,| のような文字を使用します。
  • value_one,value_two……:データ行です。前のフォーマット行に値を挿入するために使用します。すべてPerlの変数です。
  • .: 終了記号。

以下は簡単なフォーマットの例です:

例

#!/usr/bin/perl $text = "google サンプル taobao"; format STDOUT = first: ^<<<<< # 左揃え、文字長6 $text second: ^<<<<< # 左揃え、文字長6 $text third: ^<<<< # 左揃え、文字長5。taobao の最後の o は切り捨てられます $text . write

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

first: google
second: サンプル
third: taoba

フォーマット行(グラフィック行)構文

  • フォーマット行は @ または ^ で始まります。これらの行では変数置換は一切行われません。
  • @ フィールド(配列記号 @ と混同しないでください)は通常のフィールドです。
  • @,^ の後の <, >,| の長さがフィールド長を決定します。変数が定義された長さを超えると、切り捨てられます。
  • <, >,| はそれぞれ左揃え、右揃え、中央揃えを表します。
  • ^ フィールドは複数行テキストブロックの充填に使用されます。

フィールド形式

フィールドの形式は次の表のとおりです:

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

各フィールドの最初の文字は行フィラー文字です。@文字を使用する場合は、テキストフォーマットは行われません。

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

@###.##

7文字幅、小数点前4桁、小数点後2桁を表します。

例は次のとおりです:

例

#!/usr/bin/perl format EMPLOYEE = =================================== @<<<<<<<<<<<<<<<<<<<<<< @<< $name, $age @#####.## $salary =================================== . select(STDOUT); $~ = EMPLOYEE; @n = ("Ali", "サンプル", "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
===================================
===================================
サンプル                  30
  2500.00
===================================
===================================
Jaffer                  40
  4000.00
===================================

フォーマット変数

  • $~ ($FORMAT_NAME) :フォーマット名 $^ ($FORMAT_TOP_NAME) :現在のヘッダーフォーマット名を格納します
  • $% ($FORMAT_PAGE_NUMBER) :現在出力中のページ番号
  • $= ($FORMAT_LINES_PER_PAGE) :1ページあたりの行数
  • $| ($FORMAT_AUTOFLUSH) :出力バッファを自動的にフラッシュするかどうかを格納します
  • $^L ($FORMAT_FORMFEED) :各ページ(最初のページを除く)のヘッダーの前に出力する文字列を格納します

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

例

#!/usr/bin/perl $~ = "MYFORMAT"; # デフォルトのファイル変数で使用するフォーマットを指定 write; # $~ で指定されたフォーマットを出力 format MYFORMAT = # フォーマット MYFORMAT を定義 ================================= Text # サンプル ================================= . write;

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

=================================
      Text # サンプル
=================================
=================================
      Text # サンプル
=================================

$~ を指定しない場合、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", "サンプル", "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
===================================
===================================
サンプル                  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", "サンプル", "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
===================================
===================================
サンプル                  30
  2500.00
===================================
===================================
Jaffer                  40
  4000.00
===================================

他のファイルへの出力

デフォルトでは、write関数は結果を標準出力ファイルSTDOUTに出力します。任意の他のファイルに出力させることもできます。最も簡単な方法は、ファイル変数をwriteのパラメータとして渡すことです。例:

write(MYFILE);

上記のコードでは、write はデフォルトで 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 ファイルの内容を確認できます。次のようになります:

$ cat tmp 
=================================
      输入到文件中
=================================
=================================
  使用定义的格式输入到文件中
=================================
その他の拡張