【Perl】左寄せ、右寄せなど、見やすいフォーマットでレポートを出力する(write関数)

Perl

Perlは文字列の処理に優れた言語で、情報をレポートとして表示する場合にも便利な機能を持っています。本記事では、Perlを使用して、見やすい形式でレポートを出力する方法を紹介します。

実行結果の例

D:\Sample\Perl>perl  sample.pl
Name           Age City
-----------------------
Alice          30  Tokyo
Bob            25  Osaka
Carol          28  Nagoya

D:\Sample\Perl>pause
続行するには何かキーを押してください . . .

サンプルコード

以下のサンプルコードは、人物の名前、年齢、住所をレポートにして表示します。変数 $name, $age, $city はourでグローバル変数としている点に注意してください。

#!/usr/bin/perl

use strict;
use warnings;

# データを保持するハッシュの配列
my @records = (
    { name => "Alice", age => 30, city => "Tokyo" },
    { name => "Bob", age => 25, city => "Osaka" },
    { name => "Carol", age => 28, city => "Nagoya" },
);

# フォーマット変数を宣言
my($name, $age, $city);

# フォーマットの定義
format STDOUT_TOP =
Name           Age City
-----------------------
.

format STDOUT =
@<<<<<<<<<<<<< @<< @<<<<<<
$name,         $age, $city
.

# レコードの数だけループしてデータを出力
for my $record (@records) {
    ($name, $age, $city) = @{$record}{qw(name age city)};

    # フォーマット変数に値を代入してフォーマットに従って出力
    write();
}

解説

フォーマットの定義

Perlでは、formatキーワードを使って出力のフォーマットを定義できます。この例では、STDOUTとSTDOUT_TOPの2つのフォーマットを定義しています。STDOUT_TOPは、プログラムが出力を始める際に一度だけ使用されるヘッダ部分です。一方、STDOUTはデータの各行を出力するために使用されます。

フォーマット記述

フォーマットでは、@<や@<<のような指示子を使って変数の出力方法を定義します。例えば、@<<<<<<<<<<<<<は左寄せで最大14文字の文字列を意味します。数字や文字の幅、寄せ方を調整して美しい出力を実現できます。

  • @>>>   右寄せ4文字
  • @<<<<<  左寄せ6文字
  • @|||||||   中央寄せ8文字

サンプルコード

# フォーマットの定義
format STDOUT =
----------
@<<<<<<<<<
$left
@|||||||||
$center
@>>>>>>>>>
$right
----------
.

# フォーマット変数に値を設定
$left = 'L';
$center = 'C';
$right = 'R';

# フォーマットに従って出力
write();

実行結果

D:\Sample\Perl>perl  sample.pl
----------
L
    C
         R
----------

D:\Sample\Perl>pause
続行するには何かキーを押してください . . .

データの出力

レコードの数だけループを回し、各レコードについてフォーマット変数(例:$name、$age、$city)に値を代入した後、write関数を呼び出しています。write関数は、現在のフォーマットとフォーマット変数の値に基づいて出力を行います。

注意点

formatとwriteを使う際には、変数(例:$name、$age、$city)をformatとwriteの両方でアクセスできるスコープとして宣言する必要があります。

まとめ

本記事では、formatとwriteを使用したレポート作成の方法について紹介しました。テキストデータとしてレポートを作成する際には、右寄せ、左寄せ、センタリングの機能は非常に便利ですので、使ってみてください。

タイトルとURLをコピーしました