让我们打破这成碎片......
首先,创建这验证结构的功能:
sub validate
{
my ($data) = @_;
# always return true for now
return 1;
}
现在让我们开始在位填充......你要使用过滤器名称作为验证检查的一部分,所以让我们补充说,作为一个参数:
sub validate
{
my ($data, $filter_name) = @_;
# always return true for now
return 1;
}
之前做别的什么,那将是有意义的检查,如果该过滤器名称存在作为重点;如果没有,验证失败:
sub validate
{
my ($data, $filter_name) = @_;
return if not exists $data->{$filter_name};
# otherwise, return true
return 1;
}
现在还要检查是否有值。由于散列键中的定义是'存在'的超集(定义的任何值都必须存在,但并非每个存在的值都需要定义 - 因为undef可能是该值),所以可以省略第一个检查:
sub validate
{
my ($data, $filter_name) = @_;
return if not defined $data->{$filter_name};
# otherwise, return true
return 1;
}
我们已经检查了FILTER_NAME关键是存在于数据,并将其定义,但寻找一个更深层次之前,我们需要确认它真的是一个hashref:
sub validate
{
my ($data, $filter_name) = @_;
return if not defined $data->{$filter_name};
return if ref $data->{$filter_name} ne 'HASH';
# otherwise, return true
return 1;
}
现在在过滤器名称下查找'filter_actions'和'filter_criteria'键:
sub validate
{
my ($data, $filter_name) = @_;
return if not defined $data->{$filter_name};
return if ref $data->{$filter_name} ne 'HASH';
return if not defined $data->{$filter_name}{filter_actions};
return if not defined $data->{$filter_name}{filter_actions};
# otherwise, return true
return 1;
}
就是这样!请务必阅读使用perldoc perlreftoot,perldoc perlref和perldoc perldsc中的perl数据结构。
问题标题似乎并不符合您实际要求 - 你在哪里需要计数元素? – Ether 2011-02-04 18:10:08