Regex 条件正则表达式捕获,来自哈希的grepping数组

Regex 条件正则表达式捕获,来自哈希的grepping数组,regex,perl,if-statement,Regex,Perl,If Statement,给定以下匿名哈希数组: $fields_dump = [ { 'DEFAULT_FIELD_LABEL' => 'telco_hier_building', 'APPROVER_ORDER' => '0', 'IS_READONLY' => '0', 'FORM_ID' => '3913', 'REFERENCE' => 'building', }, {

给定以下匿名哈希数组:

$fields_dump = [
    {
        'DEFAULT_FIELD_LABEL' => 'telco_hier_building',
        'APPROVER_ORDER' => '0',
        'IS_READONLY' => '0',
        'FORM_ID' => '3913',
        'REFERENCE' => 'building',
    },
    {
        'DEFAULT_FIELD_LABEL' => 'Request Type',
        'APPROVER_ORDER' => '0',
        'IS_READONLY' => '0',
        'FORM_ID' => '3913',
        'REFERENCE' => 'request_type',

    },
    {
        'DEFAULT_FIELD_LABEL' => 'Request Completion Date',
        'APPROVER_ORDER' => '0',
        'IS_READONLY' => '0',
        'FORM_ID' => '3913',
        'REFERENCE' => 'request_completion_date',
    },
我想通过
DEFAULT\u FIELD\u LABEL
有条件地为
telco\u hier\u building
telco\u imac\u building
的值对数组进行grep。当它成功时,我需要提取匹配值的第二个下划线

我正在使用以下代码:

if  ( grep { $_->{DEFAULT_FIELD_LABEL} =~ m/(telco_hier_|telco_imac_)building/ } @$fields_dump ) {
    my $telco_prefix = $1;
    ...
}
条件触发正确,但regex
$1
赋值为空,在本例中,它应该是
telco\u hier\u


我做错了什么?

匹配的范围是
{}
代码块。您可以使用
来代替
循环:

use warnings;
use strict;

my $fields_dump = [
    {
        'DEFAULT_FIELD_LABEL' => 'telco_hier_building',
        'APPROVER_ORDER' => '0',
        'IS_READONLY' => '0',
        'FORM_ID' => '3913',
        'REFERENCE' => 'building',
    },
    {
        'DEFAULT_FIELD_LABEL' => 'Request Type',
        'APPROVER_ORDER' => '0',
        'IS_READONLY' => '0',
        'FORM_ID' => '3913',
        'REFERENCE' => 'request_type',

    },
    {
        'DEFAULT_FIELD_LABEL' => 'Request Completion Date',
        'APPROVER_ORDER' => '0',
        'IS_READONLY' => '0',
        'FORM_ID' => '3913',
        'REFERENCE' => 'request_completion_date',
    },
];

for (@{ $fields_dump }) {
    if ($_->{DEFAULT_FIELD_LABEL} =~ m/(telco_hier_|telco_imac_)building/) {
        my $telco_prefix = $1;
        print "$telco_prefix\n";
    }
}
输出为:

telco_hier_

进一步解释参见。

匹配的范围是
{}
代码块。您可以改用
for
循环:

use warnings;
use strict;

my $fields_dump = [
    {
        'DEFAULT_FIELD_LABEL' => 'telco_hier_building',
        'APPROVER_ORDER' => '0',
        'IS_READONLY' => '0',
        'FORM_ID' => '3913',
        'REFERENCE' => 'building',
    },
    {
        'DEFAULT_FIELD_LABEL' => 'Request Type',
        'APPROVER_ORDER' => '0',
        'IS_READONLY' => '0',
        'FORM_ID' => '3913',
        'REFERENCE' => 'request_type',

    },
    {
        'DEFAULT_FIELD_LABEL' => 'Request Completion Date',
        'APPROVER_ORDER' => '0',
        'IS_READONLY' => '0',
        'FORM_ID' => '3913',
        'REFERENCE' => 'request_completion_date',
    },
];

for (@{ $fields_dump }) {
    if ($_->{DEFAULT_FIELD_LABEL} =~ m/(telco_hier_|telco_imac_)building/) {
        my $telco_prefix = $1;
        print "$telco_prefix\n";
    }
}
输出为:

telco_hier_
进一步解释请参见