如何将$的值更改为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我建议在你更好地掌握这门语言之前,不要尝试把东西组合成一句话。