Давайте разберем это на части ...
Сначала создайте функцию, которая проверяет структуру:
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 присутствует в данных и он определен, но прежде чем заглянуть на один уровень глубже, мы должны подтвердить, что это действительно хеш-код:
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;
}
Вот и все! Обязательно прочитайте об использовании структур данных perl в perldoc perlreftoot , perldoc perlref и perldoc perldsc .