如何将$的值更改为perl中grep中所需的值?

如何将$的值更改为perl中grep中所需的值?,perl,grep,Perl,Grep,在这段代码中,我想访问哈希数组@Cleared的每个元素的键{IS-VAR}的值。当它进入循环内部时,$\u被设置为$\u->{'NAME'}的值 if (grep {$_->{'NAME'} eq $entity_name} @Cleared) { **$is_var = $_->{'IS-VAR'};** $var_flag = 1 if ($is_var =~ /^TRUE$/i); } 是否有一种方法可以访问循环中的$\u->{'Is-VAR'}值,在这种上下文中,

在这段代码中,我想访问哈希数组
@Cleared
的每个元素的键
{IS-VAR}
的值。当它进入循环内部时,
$\u
被设置为
$\u->{'NAME'}
的值

if (grep {$_->{'NAME'} eq $entity_name} @Cleared)
{
  **$is_var = $_->{'IS-VAR'};**
  $var_flag = 1 if ($is_var =~ /^TRUE$/i);
}
是否有一种方法可以访问循环中的
$\u->{'Is-VAR'}
值,在这种上下文中,
$\ucode>是
@Cleared
的元素

@Cleared
的结构如下:

@Cleared = [NAME => 'xxx',
            TYPE => 'yyy',
            IS-VAR => 'TRUE'];

您可以尝试更简单的for循环:

for my $cleared (@Cleared) {
  if ($cleared->{NAME} eq $entity_name && $cleared->{IS_VAR} eq 'TRUE') {
    $var_flag = 1
   }
}

代码的问题是在
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\u var
包含匹配的元素数<代码>如果($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
    }
}

你的
@清除了
没有任何意义。它是一个数组,因此不能像
@foo=[]
那样分配它。请给出一个完整的数据示例。如果有问题,请使用Data::Dumper。还有,你在第一段中说的是什么循环?代码与您描述的不同。太好了!我只是想说一句话。@Sujju我建议在你更好地掌握这门语言之前,不要尝试把东西组合成一句话。