【发布时间】:2011-01-17 13:54:37
【问题描述】:
我有一组字段,每个字段都有不同的验证规则。
我已经放置了用于验证哈希引用的子例程引用。
目前它在我的构造函数中,但我想把它从我的构造函数中取出来。
我已经做到了如下
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;
}
现在我想从我的构造函数中取出所有这些验证规则,并想做一些类似下面的事情,这样我就可以更好地控制基于类型字段的验证规则。(假设一些规则在一个一组字段,我可以通过覆盖字段的值来覆盖其他规则的规则。)
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... 谁能告诉我为什么这种行为与子参考。如果我检查我的姓名键,它会变为 null 或 sub {DUMMY};
【问题讨论】:
-
这里还要补充一点,我已经这样做了
Field1 => {name => sub{$self->checkField1(@_);},有时我还必须验证单个字段,并考虑调用单个字段规则,例如$obj->checkField1('string',@args);如果有一个更好的方法准备改变我的方法 -
这里发生了有趣的事情,它没有任何问题,实际上,我定义了从 Field1 开始的键,生成的第一个字段是 Field0 :-( .. 但是这个问题仍然有更好的方法。
-
您将它们放入属性中的每个对象的验证实际上是否不同,或者您只是为了捕获
$self而这样做?因为你不需要... -
@Hobbs,对于当前场景,我有两个文件,每行分别包含 50 和 60 个字段。我必须为不同的规则集验证每个字段。基于类型 1 或类型 2 文件,我将生成验证哈希,然后在循环中按顺序对每个字段应用规则。而相同的字段也出现在应用程序的其他部分(但不是一次所有字段)。我正在考虑使用相同的子例程(适用于 60 个中的 5 个)。这就是为什么我试图让它附着在对象上,我不确定这种方法是否会给我带来任何好处或损失。
标签: perl validation constructor reference subroutine