前回の
設定ファイルの利用
ここでは、
設定ファイルはなぜ必要か
コマンドラインツールでは、
設定値を渡す方法として、
それに対して設定値を設定ファイルとして持つようにすると、
設定ファイルの形式
Perlで書かれたコマンドラインツールの設定ファイルには、
| 形式 | 特徴 | 
|---|---|
| JSON | プログラムによる解釈が簡単。人間が読みづらくなる場合がある | 
| YAML | インデントといくつかの記号で構造を表す。比較的人間が読みやすい | 
| TOML | シンプルな記法。複雑な構造の記述には向いていない | 
| Perl | Perlコードそのもの。データの表現力は高いがPerlコードを書ける人でないと使えない | 
Perlコードを設定ファイルとして使う方法
Perlコードを設定ファイルとして使う場合、
+{
    dbi => ["dbi:mysql:database=foo", "user", "pass"],
    filepath => '/path/to/file',
};設定ファイルを利用するプログラムでは、
my $config = do 'config.pl';
$config->{filepath}
# => /path/to/filePerlコードを設定ファイルとして使う利点は、
my $conf = {
    path => '/path/',
};
# 分岐と環境変数の利用
if ($ENV{TEST}) {
    $conf->{debug} = 1;
}
$conf;ただし逆に言えば、
JSON/YAML/TOMLを設定ファイルとして使う方法  
設定ファイルとして何らかの記法で記述されたファイルを使う場合、
例として、
my $opt = Smart::Options->new
       ->coerce('File' => 'Str', sub { path($_[0]) })
       ->type('conf' => 'File')->parse();
unless ($opt->{conf}) {
    my $default_conf = +{
        file => '/path/to/file',
        rows => 10,
    };
    path('.config')->spew(encode_json($default_conf));
    print "write default config => .config\n";
    exit;
}
my $config = decode_json($opt->{conf}->slurp());
# 以下、コマンドラインツールの実際の処理このコードでは、confオプションが指定されなかった場合、.configという名前で設定ファイルを作成し、
コマンドラインツールの入出力
ここまで、
IO::Prompt::Simpleを使ったインタラクティブな入力
コマンドラインツールを実行する際、IO::Prompt::Simpleを使うと、
use IO::Prompt::Simple;
# 前処理
my $answer =
    prompt 'ファイルの削除を実施します。よろしいですか? (y/N)',
    'N';
if ($answer eq 'y') {
    # ファイル削除
} elsif ($answer eq 'N') {
    print "ファイルの削除をキャンセルしました\n";
    exit;
} else {
    die 'invalid input';
}prompt関数の第1引数にはユーザーへのメッセージ、promptの戻り値として返ってきます。
prompt関数の第2引数がスカラ値の場合はデフォルト値として扱われますが、
use IO::Prompt::Simple;
my $answer =
     prompt 'ファイル削除を実施します。よろしいですか?',
            { anyone => [qw/y N/], ignore_case => 1 };詳しくは、IO::Prompt::Simpleのドキュメントを参照してください。
環境変数からの入力
本項では環境変数から入力を受け付ける方法を説明します。ここまで紹介したコマンドライン引数を使う方法、TERM変数やLANG変数など、crontabで複数のコマンドの実行計画を定義している場合、
MAILTO=report@example.com
0 * * * * /path/to/cmd1.pl
30 1 * * * /path/to/cmd2.pl上記のように記述すれば、cmd1.でもcmd2.でも$ENV{MAILTO} でレポート送信先メールアドレスreport@example.)
ほかに、Smart::Optionsでも対応しています。
use Smart::Options;
$ENV{TEST_FLAG} = 'FLAG VALUE';
Smart::Options->new->env_prefix('TEST')
              ->env('flag')->parse();
# => { 'flag' => 'FLAG VALUE' }envメソッドを使うと、env_で指定した接頭辞_大文字化したオプション名」TEST_)
なお、Smart::Optionsでは、
色付きの出力
diffコマンドなどが良い例ですが、Term::ANSIColorを使えばエスケープシーケンスを使わずに色名の指定で同じことをできます。
use Term::ANSIColor;
print color('red') . "この文字は赤く表示されます\n";
print color('red') . "この文字も赤く表示されます\n" . colo
r('reset');
print "この文字は普通の色で表示されます\n";
print color('on_blue white');
print "この文字は青地に白で表示されます\n";
print color('reset');color関数に色を渡すことで、color('reset')を出力するまで色は変わったままになります。
color('on_のようにon_を色名に付けると背景色の指定になります。それ以外にもboldblinkunderTerm::ANSIColorのドキュメントを参照してください。
<続きの
本誌最新号をチェック!
WEB+DB PRESS Vol.130
2022年8月24日発売
B5判/
定価1,628円
ISBN978-4-297-13000-8
- 特集1
 イミュータブルデータモデルで始める
 実践データモデリング
 業務の複雑さをシンプルに表現!
- 特集2
 いまはじめるFlutter
 iOS/Android両対応アプリを開発してみよう 
- 特集3
 作って学ぶWeb3
 ブロックチェーン、スマートコントラクト、 NFT 


