根据匿名散列数组中的另一个值直接访问值

时间:2013-07-08 18:47:56

标签: arrays perl data-structures hashtable associative-array

给出以下匿名哈希数组:

$AoH = [
    {    
         'FORM_FIELD_ID'        => '10353',
         'VISIBLE_BY'           => '10354',
         'FIELD_LABEL'          => 'ISINCIDENT',
         'VALUE'                => '',
         'DEFAULT_FIELD_LABEL'  => 'Yes No',
         'FORM_ID'              => '2113',
    },
    {
         'FORM_FIELD_ID'        => '10354',
         'VISIBLE_BY'           => '0',
         'FIELD_LABEL'          => 'CATEGORY',
         'VALUE'                => 'zOS Logical Security (RACF)',
         'DEFAULT_FIELD_LABEL'  => 'CATEGORY',
         'FORM_ID'              => '2113',
    },
    {
         'FORM_FIELD_ID'        => '10368',
         'VISIBLE_BY'           => '10354',
         'FIELD_LABEL'          => 'STARTDATE',
         'VALUE'                => '',
         'DEFAULT_FIELD_LABEL'  => 'REQTYPE',
         'FORM_ID'              => '2113',

    }
];

如果我知道FIELD_LABEL是10353,我将如何直接访问FORM_FIELD_ID值?

我知道我可以遍历@$AoH并根据$_->{FIELD_LABEL}有条件地找到$_->{FORM_FIELD_ID} == 10353,但是如果同一个哈希中的其他值之一,则无论如何都可以直接访问所需的值已知?

2 个答案:

答案 0 :(得分:4)

不,除非您更改数据结构。你可以,例如通过表单字段id索引记录:

my %by_form_field_id = map { $_->{FORM_FIELD_ID} => $_ } @$AoH;

然后:

my $field_label = $by_form_field_id{10353}{FIELD_LABEL};

在不更改数据结构的情况下,您必须grep

my $field_label = (grep { $_->{FORM_FIELD_ID} == 10353 } @$AoH)[0]->{FIELD_LABEL};

答案 1 :(得分:0)

你必须通过@array编写一个函数循环并检查%hash或者使用内置grep方法:

say $_->{FIELD_LABEL} for (grep { $_->{FORM_FIELD_ID} == 10353 } @$AoH )

的工作原理。这样做:

say %$_->{FIELD_LABEL} for (grep { $_->{FORM_FIELD_ID} == 10353 } @$AoH ) 

但它会发出Using a hash as a reference is deprecated警告(pumpkin perl-5.16.3)。