在这段代码中,我想访问{IS-VAR}哈希数组中每个元素的键值@Cleared.当它进入内部时,循环$_被设置为值$_->{'NAME'}.
if (grep {$_->{'NAME'} eq $entity_name} @Cleared)
{
**$is_var = $_->{'IS-VAR'};**
$var_flag = 1 if ($is_var =~ /^TRUE$/i);
}
Run Code Online (Sandbox Code Playgroud)
有没有办法访问$_->{'IS-VAR'}循环内部的值,$_作为@Cleared此上下文中的元素?
结构@Cleared如下:
@Cleared = [NAME => 'xxx',
TYPE => 'yyy',
IS-VAR => 'TRUE'];
Run Code Online (Sandbox Code Playgroud)
小智 10
代码的问题在于您grep在if声明中使用.这会将结果grep转换为标量(将是grep找到的元素数).因此,您实际上并不知道哪些元素匹配.
如果将其转换为for循环,则可以访问匹配的每个元素; 你的其余代码将逐字工作:
foreach (grep {$_->{'NAME'} eq $entity_name} @Cleared)
{
$is_var = $_->{'IS-VAR'};
$var_flag = 1 if ($is_var =~ /^TRUE$/i);
}
Run Code Online (Sandbox Code Playgroud)
但是,如果您只想查找单个行是否匹配,则可以将其全部压缩为单个grep:
my $is_var = grep {
$_->{'NAME'} eq $entity_name && $_->{'IS-VAR'} =~ /^TRUE$/i
} @Cleared;
Run Code Online (Sandbox Code Playgroud)
现在$is_var包含匹配的元素数量. if ($is_var) {...}如果至少有一个匹配,那将是真的.
grep但是,如果您只需知道是否存在至少一个匹配项,则不是最有效的方法.理想情况下,您应该在找到一个匹配后立即停止:
my $is_var;
foreach (@Cleared)
{
if ($_->{'NAME'} eq $entity_name && $_->{'IS-VAR'} =~ /^TRUE$/i)
{
$is_var = 1;
last; #break out of the loop
}
}
Run Code Online (Sandbox Code Playgroud)