Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 迭代数组后返回布尔值_Perl - Fatal编程技术网

Perl 迭代数组后返回布尔值

Perl 迭代数组后返回布尔值,perl,Perl,我正在尝试查看关键字_objects是否有一个元素{name=>'CRASH',status=>'+'} #$bug是对以下数据的引用 { “关键字_对象”=>[ 祝福({'name'=>'CRASH','status'=>'+'},'SomeModule::SomeFilename'), 祝福({'name'=>'CUSTOMER','status'=>'-'},'SomeModule::SomeFilename')], “类别”=>“错误” } 我在另一种语言中找不到类似于filter的

我正在尝试查看
关键字_objects
是否有一个元素
{name=>'CRASH',status=>'+'}

#$bug是对以下数据的引用
{ 
“关键字_对象”=>[
祝福({'name'=>'CRASH','status'=>'+'},'SomeModule::SomeFilename'),
祝福({'name'=>'CUSTOMER','status'=>'-'},'SomeModule::SomeFilename')],
“类别”=>“错误”
}
我在另一种语言中找不到类似于
filter
的东西,所以我的选择是使用
map

my@isCrash=map{$\->name eq'CRASH'&&$\->status eq'+'}{$bug->{keyword_objects};

问题是,当没有这样的关键字时,每次操作完成时,它似乎都返回一个空值
@isCrash
成为多个空值的数组,如果(@isCrash)变得无用,则
。我当然可以引入一个新的变量,它可以从映射操作中更改,但我觉得应该有更好的方法来实现。请有人加入并分享您的知识。

您的代码将每个条目映射到逻辑表达式的标量值(true或false)。
尝试下面的代码将其映射到条目本身以进行匹配,将其映射到空列表以进行不匹配。
多个空列表之和为空列表

my @isCrash = map { $_->name eq 'CRASH' && $_->status eq '+' ? ($_) : () } @{ $bug->{keyword_objects} };

另一种方法是使用
grep

# get list of "crashed" elements 
my @CrashedList = grep { $_->name eq 'CRASH' && $_->status eq '+'} @{ $bug->{keyword_objects} };
# get number of "crashed" elements in scalar context
my $numberOfCrashes = grep { $_->name eq 'CRASH' && $_->status eq '+'} @{ $bug->{keyword_objects} };
在Perl中(实际上,在一般的Unix中),
filter
的拼写是
grep

my $is_crash = grep { $_->name eq 'CRASH' and $_->status eq '+' }
                 @{ $bug->{keyword_objects} };
发件人:

grep阻止列表
grep EXPR,列表

[…剪断…]

为列表的每个元素计算块或表达式(本地将$设置为每个元素),并返回由表达式计算为true的元素组成的列表值。在标量上下文中,返回表达式为真的次数


因此,
$is\u crash
将包含表达式为true的输入列表中的元素数。这可以用作布尔值(因为零为假,所有其他整数为真)。

“类似过滤器的东西”是,它正是一个过滤器;似乎您可以将
map
替换为
grep
。但我这里有一些严肃的问题。arrayref的元素是对象——为什么要这样动态创建它们?没有任何方法的对象的目的是什么?然后它们只能像hashrefs一样被查询,因为在这些特殊类中没有其他工具。。。但那只是坏习惯。这代表其他更复杂的代码吗?[cont'd]。。。另外,
$\uu->name
意味着有一个方法
name
(“getter”用于该属性)——因此,如果确实存在在某个地方构建的类,那么为什么不在这里使用它的构造函数(
new
)?现在,如果您想澄清一下(回答我在第一条评论中提出的问题)我们或许可以用一个合理的答案来回答这个问题。(或者你真的只是想把
grep
粘贴在那里,而不是
map
…)@zdim 1。我不知道grep可以用来过滤数组!:)2.我正在编辑一个子模块,这就是给定的参数。当我查看包
SomeModule::SomeFilename
时,它包含子模块和所有这些。多谢各位!