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 ファイルの内容を表示できます。