Perl:计算复杂数据结构中的元素

Jan*_*kie 3 arrays perl hash perl-data-structures

我是复杂数据结构的新手.我有点理解他们背后的想法,但是在获取数据方面遇到了一些困难.我通过使用Data :: Dumper找到了当前问题孩子的结构....

$VAR1 = {
      '4' => {
               'engine_coded' => 0,
               'name' => 'FILTER_1',
               'filter_actions' => {
                                     'X_Override_Queue_Level' => 'Value'
                                   },
               'filter_criteria' => [
                                      [
                                        'X_Charge',
                                        '=',
                                        'X_CHARGE_1'
                                      ]
                                    ]
             }
    };
Run Code Online (Sandbox Code Playgroud)

我需要做的是确保给定一个过滤器名称(在本例中为"4"),"name"有一个值,以及"filter_actions"和"filter_criteria".

任何人都知道如何最好地完成这个?非常感谢!珍妮

Eth*_*her 5

让我们分解成碎片......

首先,创建一个验证结构的函数:

sub validate
{
    my ($data) = @_;

    # always return true for now
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

现在让我们开始填写这些位...你想使用过滤器名称作为验证检查的一部分,所以让我们将其作为参数添加:

sub validate
{
    my ($data, $filter_name) = @_;

    # always return true for now
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

在做任何其他事情之前,检查过滤器名称是否作为键存在是有意义的; 如果没有,验证失败:

sub validate
{
    my ($data, $filter_name) = @_;

    return if not exists $data->{$filter_name};

    # otherwise, return true
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

现在还检查是否有值.由于散列键中的定义是'exists'的超集(定义的任何值也必须存在,但不是每个需要定义的值 - 因为undef可能是值),可以省略第一个检查:

sub validate
{
    my ($data, $filter_name) = @_;

    return if not defined $data->{$filter_name};

    # otherwise, return true
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

我们已经检查过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;
}
Run Code Online (Sandbox Code Playgroud)

现在在过滤器名称下查找"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;
}
Run Code Online (Sandbox Code Playgroud)

而已!请务必阅读perldoc perlreftoot,perldoc perlrefperldoc perldsc中使用perl数据结构的内容.