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

标签 perl grep

在这段代码中,我想访问散列数组 @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/

相关文章:

linux - 如何使用 linux 字符串操作从 html 文档中提取天气数据

perl - 如何使用 Perl 的 WWW::Mechanize 从超时中恢复?

regex - perl:正则表达式,如何在找到的正则表达式左侧获取数据

perl - 使用另一个数组订购哈希 perl

linux - grep/根据第一个文件中的列表从第二个文件中获取字符串

regex - 过滤匹配的内容

linux - 输出最后六个字符串

linux - perl 获取linux缓存内存数

windows - 如何从 MinGW 安装管理器安装 perl 5.10?

linux - 我可以让 grep 返回几个文件中出现的真实次数吗?