Smart -Web Magazine

WEB開発者に嬉しいステキ講座

MENU

フォーマット

2009年7月6日 2 COMMENTS

フォーマットの概要

formatを利用することで、ヘッダやフッタの設定や、テキストの右寄せ、中央揃え、左寄せなどのレイアウト、ファイルへの書き込みなどを簡単に行うことができます。

フォーマット宣言

レポートを作成するには、『ピクチャ』を定義し、出力する行の書式を1行単位で指定するのが基本です。宣言はformat、実行するには write を使用します。

フォーマット宣言
format フォーマット名 =
フォーマットリスト
.

出力レコードの書式は、format 宣言に続けてフォーマット名を指定します。フォーマット名を省略した際はSTDOUTが設定されます。ファイルハンドル用のデフォルトフォーマット名は、ファイルハンドルと同じになりますから、ファイルハンドルと同じフォーマット名にすると便利です。
フォーマットリストはフィールドの並びで、コメントピクチャ行引数行を定義します。ピクチャ行では、出力するフィールドの幅と位置を示すシンボルを定義します。その次に引数行で、ピクチャ行で定義したシンボルの値を指定します。

簡単なフォーマット出力
$name = 'SMART!';
format STDOUT =
# コメントは出力されない
Welcom to @<<<<<<<<<
$name
.
write;
> Welcom to SMART!

※ format では、グローバルな変数と local()で宣言された動的スコープの変数だけが見えます。my() で宣言された字句スコープの変数は、formatと同じスコープにあるとはみなされず、使用することができません。

フォーマットリストの種類一覧
フォーマットリスト 説明
コメント 行頭に # を置くとその行はコメントとして扱われます。
書式ピクチャ行 出力する行のフォーマットを1行単位で示します。
引数行 先行するピクチャ行に埋め込む値を示します。

フォーマット作成

フィールドピクチャ

レポートの作成で最も基本的なテクニックは、レポートの各フィールドを揃えることです。ここれは、フィールドを左揃え、右揃え、中央揃えにする方法を紹介します。

書式ピクチャの概要

ピクチャ行は、命令文を除いて見た目の通りに印字されます。ピクチャ行の各々のフィールドは、アットマーク( @ )やキャレット( ^ )で始まります。@ フィールドは通常のフィードで、^ フィールドが複数行に渡るテキストのブロックを作るために使われます。
フィールドの長さは、@ や ^ のあとに左寄せの左アングルブラケット( < )や、右寄せの右アングルブラケット( > )、中央寄せのパイプ文字( | )、数値フィールドのシャープ( # )をつけて、フィールドを定義します。
値がフィールドを超える場合には、切り捨てとなります。ピクチャ行では、変数の展開は行なわれません。

フィールドピクチャの一覧
フィールドピクチャ 説明
@<<<< 行を左寄せにする。値が行の幅よりも短い場合、右側に空白が埋められる。
@>>>> 行を右寄せにする。値が行の幅よりも短い場合、左側に空白が埋められる。
|||| フィールドで中央揃えにする。値が行の幅よりも短い場合、値が行のほぼ中央に来るように両側に空白が埋められる。
@###.## 数値フィールド(整数3桁、少数2桁)
^<<<< 行の内容を適切な長さで折り返しします。

フィールドピクチャを使ったサンプルです。

簡単なフォーマット出力
$name = "boogie";
$age = 29;
format STDOUT =
Hello, my name is @<<<<<<<<<< and I'm @<<< years old.
$name, $age
.
write; # デフォルトで STDOUT に出力
> Hello, my name is boogie     and I'm 29  years old.

フィールドピクチャの @<<<<<<<<<<、@<<< でそれぞれテキストを13文字と3文字のフィールドに左寄せ指示をしています。

数値フィールド

上記で紹介したフィールドピクチャとは別に、固定精度数値フィールドが用意されています。このフィールドも先頭は @ で始まりますが、その後ろにはシャープ記号( # )が続きます。また、1個のピリオド( . )を使って、小数点の位置をそろえることができます。

数値フィールドの出力テスト
my $er = 3.14159265358979;
format STDOUT =
Assets: @#.####
$er
.
write();
> 3.14

マルチラインフィールド

 @ を先頭とするフィールドは、引数行で指定した値の中に改行文字を見つけると、そこでデータの挿入を終了し、残りの値を無視します。つまり、改行文字に続く文字列は常に無視されてしまいます。
 複数の改行文字を含む値を差し込みたいような場合は、マルチラインフィールドというシンボルを使用します。マルチラインフィールドは、通常のフィールドシンボルと同様に @ 記号で始まり、その後に1つのアスタリスク(*)が続きます。
このフィールドを使う場合には、同じ行に別のフィールドを指定できません。

マルチラインフィールドの出力テスト
$word = "SMART!\n   ---rhythmfactory";
format STDOUT =
Welcom to @*
$word
.
write;
> Welcom to SMART!
>    ---rhythmfactory

行の折り返し

長い行をなどを適切な文字数で折り返しをしたいような場合、詰め込みフィールドというシンボルを使います。詰め込み整形フィールドは、ピクチャ行の先頭の @ をキャレット( ^ )に換えたものです。詰め込み整形フィールドを使うことによって、必要に応じてテキストを単語の切れ目で分割し、行の折り返しを行います。

行の折り返しテスト
$word = "Perl 5.005_63 introduces the beginnings of support for running multiple interpreters concurrently in different threads.";
format STDOUT =
^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$word	^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$word			^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$word			^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$word
.
write;
> Perl 5.005_63 introduces the beginnings
> of support for running multiple
> interpreters concurrently in different
> threads.

フィールドの先頭でチルダ( ~ )を指定すると、空行のような余分な行は出力されなくなります。~ を 2つ並べて書くと、すべてのフィールドに入れられる値が尽きてしまうまで、そのピクチャ行と引数行を繰り返して使用します。

チルダ( ~ )を使った折り返しテスト
$word = "Perl 5.005_63 introduces the beginnings of support for running multiple interpreters concurrently in different threads.";
format STDOUT = 		~~^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$word
.
write;
> Perl 5.005_63 introduces the beginnings
> of support for running multiple
> interpreters concurrently in different
> threads.

一番最後のフィールドを ...という文字列で終わらせておくと、引数行で指定した値がフィールドに収まりきらなかったときに、文の最後に ...が付け足されて出力されます。

... を使った折り返しテスト
$word = "Perl 5.005_63 introduces the beginnings of support for running multiple interpreters concurrently in different threads.";
format STDOUT = 		^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$word			^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$word			^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<...
$word
.
write;
Perl 5.005_63 introduces the beginnings
of support for running multiple
interpreters concurrently in different...

ページ設定

レポートにはヘッダやフッタ、ページ番号などが必要不可欠ですので、ここではそれらを表現するための方法を紹介していきます。

ヘッダ

レポートにヘッダを設定するための方法を紹介します。ヘッダとして出力したいデータのフォーマット名に _TOP をつなげることで、そのファイルハンドルはヘッダと解釈されます。

ヘッダの出力
# /etc/passwd ファイルについてのレポート
open(FH, "/etc/passwd");
while (<FH>){
    ($account,$passwd,$uid,$gid,$detail,$home) = split /:/,$_;
    write;
}
close FH;
format STDOUT_TOP =
Passwd File
Account Password Uid Gid Detail Home
-------------------------------------
.
format STDOUT =
@<<<<<<<<<< ******** @>>>> @>>>> @<<<<<<<<<<<<<<<<<<<<
@<<<<<<<<<<<<<<<<<<<<
$account, $uid, $gid, $detail, $home
.
このエントリーをはてなブックマークに追加

2 Comments

  1. I simply want to say I am just new to blogs and certainly loved your web blog. Probably I’m likely to bookmark your blog post . You absolutely come with fabulous articles. Thank you for sharing with us your web-site.

  2. Also a thing to mention is that an online business administration program is designed for college students to be able to easily proceed to bachelor degree programs. The 90 credit college degree meets the other bachelor college degree requirements when you earn your associate of arts in BA online, you will have access to up to date technologies on this field. Several reasons why students want to get their associate degree in business is because they can be interested in the field and want to find the general education and learning necessary prior to jumping to a bachelor college diploma program. Thanks for the tips you really provide in your blog.

コメントを残す

Jump to the top