我对复杂数据结构不熟悉。我有点理解他们背后的想法,但在获取数据时遇到一些困难。我通过使用 Data::Dumper 找出了当前问题 child 的结构....
$VAR1 = {
'4' => {
'engine_coded' => 0,
'name' => 'FILTER_1',
'filter_actions' => {
'X_Override_Queue_Level' => 'Value'
},
'filter_criteria' => [
[
'X_Charge',
'=',
'X_CHARGE_1'
]
]
}
};
我需要做的是确保给定一个过滤器名称(在本例中为“4””),“name”以及“filter_actions”和“filter_criteria”都有一个值。
有人知道如何最好地实现这一目标吗?非常感谢! 珍妮
最佳答案
让我们把它分解成几个部分......
首先,创建一个验证结构的函数:
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;
}
现在还要检查是否有一个值。由于哈希键中的定义性是“exists”的超集(定义的任何值也必须存在,但并非每个存在的值都需要定义 - 因为 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 中有关使用 perl 数据结构的内容。 , perldoc perlref ,和 perldoc perldsc .
关于arrays - Perl:计算复杂数据结构中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4901308/