アプリに必要な他の構成値を検証するために後で使用されるタイプを定義するために、構成ファイル (YAML) を使用しています。
---
action: >
use List::MoreUtils;
my $value = $_;
any { $value eq $_ } qw(fatal keep merge non-fatal replace);
dir : return defined $_ ? -d $_ : -1;
file : return defined $_ ? -f $_ : -1;
string: 1;
---
config-element:
value: foo
type : file
etc ...
アイデアは、eval
各タイプ定義に対して、それらをハッシュにスローしてから、構成データを検証するために呼び出すことです (以下は、わかりやすくするための概略図です)。
#throw sub refs into hash
my %type_sub;
foreach my $key (keys %$type_def_ref) {
my $sub_str = "sub {$type_def_ref->{$key}}";
$type_sub{$key} = eval $sub_str;
}
#validate (myfile is a real file in the cwd)
print $type_sub{file}->('myfile'),"\n";
print $type_sub{action}->('fatal'), "\n";
問題は、%type_sub のサブルーチンがパラメーターを受け入れないように見えることです。上記の場合、最初の print ステートメントは出力-1
し、2 番目の出力は次のようになります。
Use of uninitialized value $value in string eq at (eval 15) line 1.
Use of uninitialized value $_ in string eq at (eval 15) line 1.
Can't call method "any" without a package or object reference at
(eval 15) line 1.
これは私が期待するものではありませんが、サブルーチンが呼び出されています。
私は何を間違っていますか?
編集:私はずさんでしたが、今ではすべて正常に動作しています。フリードのおかげです。