我想看看是否keyword_objects有一个元素{name=>'CRASH', status=>'+'}。
# $bug is a reference to the below data
{
'keyword_objects' => [
bless( { 'name' => 'CRASH', 'status' => '+'}, 'SomeModule::SomeFilename' ),
bless( { 'name' => 'CUSTOMER', 'status' => '-' }, 'SomeModule::SomeFilename' ) ],
'category' => 'error'
}
Run Code Online (Sandbox Code Playgroud)
我filter在另一种语言中找不到类似的东西,所以我的替代方法是使用map.
my @isCrash = map { $_->name eq 'CRASH' && $_->status eq '+' } @{ $bug->{keyword_objects} };
Run Code Online (Sandbox Code Playgroud)
这样做的问题是,当没有这样的关键字时,每次操作完成时,似乎都返回一个空值。@isCrash成为多个空值的数组并if(@isCrash)变得无用。我当然可以引入一个可以从地图操作中更改的新变量,但我觉得应该有更好的方法来做到这一点。有人请插话并分享您的知识。
在 Perl 中(实际上,在 Unix 中),filter拼写为grep.
my $is_crash = grep { $_->name eq 'CRASH' and $_->status eq '+' }
@{ $bug->{keyword_objects} };
Run Code Online (Sandbox Code Playgroud)
grep 块列表
grep EXPR,LIST[……剪……]
为 LIST 的每个元素计算 BLOCK 或 EXPR(将 $_ 本地设置为每个元素),并返回由表达式计算为真的那些元素组成的列表值。在标量上下文中,返回表达式为真的次数。
So$is_crash将包含输入列表中表达式为真的元素数。这可以用作布尔值(因为零为假,所有其他整数为真)。