私は、各フィールドに異なる検証ルールのセットを持つ一連のフィールドを持っています。perlサブルーチンリファレンス
ハッシュリファレンスを検証するためのサブルーチンリファレンスを配置しました。
現在のところ、私のコンストラクタにありますが、プライベートサブのコンストラクタから取り出したいと思っています。
私は私が私の検証を超えるいくつかのよりよい制御を持っているように、今私は、私のコンストラクタのうち、すべてこの検証ルールを取り出したいと以下のようないくつかのことをしたい
sub new {
my $class = shift;
my $self = {@_};
$class = (ref($class)) ? ref $class : $class;
bless($self, $class);
$self->{Validations} = {
Field1 => {name => sub{$self->checkField1(@_);},args => [qw(a b c)]}
Field2 => {name => sub{$self->checkField2(@_);},args => {key1, val1}}
..
..
..
..
};
return $self;
}
以下のようにそれを行っていますタイプフィールドに基づいたルール。(セイいくつかのルールは、フィールドの1セットに共通していると私はフィールドの値を上書きすることにより、他のルールのためのルールを上書きすることができます。)
bless($self, $class);
$self->{Validations} = $self->_getValidation($self->{type});
return $self;
}
sub _getValidation{
my ($self,$type) = @_;
my $validation = {
Field1 => {name => sub {$self->checkField1(@_);}, args => {key1 => val1}},};
return $validation;
}
しかし、誰もが私に言うことができます私はCan't use string ("") as a subroutine ref while "strict refs" in use at...
を取得していますなぜこの動作がsub ref。私が私の名前のキーをチェックすると、nullまたはサブ{ダミー}になる。
もう一つ、私はそれを行っています'このようにして、個々のフィールドも検証しなければならず、' $ obj-> checkField1のような個々のフィールドルールを呼び出すことも考えなければなりません( 'string'、@ args);もし私のアプローチを変更する準備が整ったら – awake416
ここで面白いことが起きましたが、問題なく動作します。実際にField1を開始するキーを定義し、 (..しかし、この質問は、よりよいアプローチのためにまだ開いている。 – awake416
バリデーションは属性に入れているオブジェクトごとに実際に違うのですか?それとも、 '$ self'をキャプチャするだけですか?あなたがする必要はありませんので... – hobbs