前回の
設定ファイルの利用
ここでは、
設定ファイルはなぜ必要か
コマンドラインツールでは、
設定値を渡す方法として、
それに対して設定値を設定ファイルとして持つようにすると、
設定ファイルの形式
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/file
Perlコードを設定ファイルとして使う利点は、
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_
を色名に付けると背景色の指定になります。それ以外にもbold
blink
under
Term::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