dieのメッセージをエンコードするモジュール
投稿:2018-12-21
エンコードしない場合のトラブルとdieの代替処理を書くところまで。
エラー出力が出ない
エラー出力が出ない
こんなモジュールをデッチ上げました。
大抵のモジュールはパッケージ名を指定しますけれど、こいつはパッケージ名を書いてないので呼び出したパッケージ内にdieが定義されます。
use utf8; use Encode::Locale; use subs "die"; sub die { my @msg = @_; if (@_ && $msg[-1] =~ /\n$/) { @msg = map {Encode::encode console_out => $_} @msg; CORE::die @msg; } else { $msg[0] = "Died" if !@msg; my (undef, $filename, $line) = caller; $filename = Encode::decode locale_fs => $filename; $line = Encode::decode locale => $line; CORE::die Encode::encode console_out => "@msg at $filename line $line.\n"; } } 1;
こんなコードです。
スクリプトと同じディレクトリのモジュール/ファイルを指定できるようにFindBinを使います。
#!/usr/bin/env perl -w use utf8; use strict; use warnings; use v5.10; use Encode::Locale; use FindBin; use lib $FindBin::Bin; use MyDie; use open IO => ":utf8"; binmode STDOUT, ":encoding(console_out)"; binmode STDIN, ":encoding(console_in)"; $| = 1; my $target = Encode::decode locale_fs => "$FindBin::Bin/not_exist.txt"; open my $fh, "<", $target or die "${target}が開かないよ。$!"; exit;
まあ、見た目は普通ですね。
この「普通」を叶えるために色々と工夫する手間が好きです。
C:\>perl ああああああ/sample_45.pl C:/ああああああ/not_exist.txtが開かないよ。No such file or directory at ああああああ/sample_45.pl line 23.
初めてテストを書いてみました。
モジュールがあるディレクトリにディレクトリ「t」を作り、case1.tを書きました。
use utf8; use strict; use warnings; use Test::More; use Test::Exception; use FindBin; use lib "$FindBin::Bin/.."; use MyDie; use open IO => ":utf8"; binmode STDOUT, ":encoding(console_out)"; binmode STDIN, ":encoding(console_in)"; $| = 1; # 普通のメッセージでは、ファイル名と行位置そして"line"を表示 dies_ok { die "本日は晴天なり。"; } "line"; # 最後のメッセージの末尾に改行があると、メッセージだけ dies_ok { die "本日は晴天なり。\n"; } Encode::encode console_out => "本日は晴天なり。"; # メッセージがなければ"Died"で代替 dies_ok { die; } "Died"; done_testing;