在这段代码中,我想访问散列数组 @Cleared
的每个元素的键 {IS-VAR}
的值。当它进入循环内部时,$_
被设置为 $_->{'NAME'}
的值。
if (grep {$_->{'NAME'} eq $entity_name} @Cleared)
{
**$is_var = $_->{'IS-VAR'};**
$var_flag = 1 if ($is_var =~ /^TRUE$/i);
}
有没有办法在循环内访问 $_->{'IS-VAR'}
的值,$_
是 的元素@Cleared
在这种情况下?
@Cleared
的结构如下:
@Cleared = [NAME => 'xxx',
TYPE => 'yyy',
IS-VAR => 'TRUE'];
最佳答案
您的代码的问题是您在 if
语句中使用了 grep
。这会将 grep
的结果转换为标量(这将是 grep
找到的元素数)。因此,您实际上并不知道哪些元素匹配。
如果将其转换为 for 循环,您将能够访问每个匹配的元素;您的其余代码将逐字执行:
foreach (grep {$_->{'NAME'} eq $entity_name} @Cleared)
{
$is_var = $_->{'IS-VAR'};
$var_flag = 1 if ($is_var =~ /^TRUE$/i);
}
但是,如果您只是想查找单行是否匹配,则可以将其全部压缩到一个 grep 中:
my $is_var = grep {
$_->{'NAME'} eq $entity_name && $_->{'IS-VAR'} =~ /^TRUE$/i
} @Cleared;
现在 $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
}
}
关于perl - 如何将 $_ 的值更改为 perl 中 grep 中所需的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16208859/