【问题标题】:Remove items from array in perl using logical OR使用逻辑或从perl中的数组中删除项目
【发布时间】:2017-07-24 20:46:32
【问题描述】:

我有一个数组。我希望数组没有任何 $regex 值(以逻辑 OR 方式)。 我以否定的方式使用 grep 命令,但我认为这不能解决我的问题。非常感谢任何帮助。谢谢

 #!/usr/bin/perl -w 

use Data::Dumper;

    my @array = ['hard_link is not present', 'dynamic variable', 'segfault'] ;

    my $regex = qr/create_hard_link|Failed to reassign|Global variable/ ;

    print Dumper(\@array) ;
    my @wanted_array = grep  {!$regex} @array ;
    print Dumper(\@wanted_array);

它给了我一个输出

$VAR1 = [
          [
            'hard_link is not present',
            'dynamic variable',
            'segfault'
          ]
        ];
$VAR1 = [];

【问题讨论】:

  • 另外,[ ... ] 创建一个数组引用。你想要@array = ( ... )。所以@array = [ ... ] 创建了该arrayref 并将其分配给@array 的第一个元素。我想这不是你想要的。
  • 然后,我建议您检查您的其他问题并投票(现在您有足够的信用)并接受合适的。这可能与您当前问题的奇怪反对票有关,也可能无关。我不会在此处发布此评论,以免进一步加剧这种情况。当你看到这个时告诉我。
  • @zdim 我对其他问题的投票对当前的投票情况有何帮助?
  • 老实说,我不知道这个问题是怎么回事。当然,其他问题不应该对那个问题进行投票,但生活并不像我们所知的那么简单。以我的经验,人们不会撤回反对票......但这可能有助于未来的问题。如果这是导致它的原因——我猜是因为我不理解这些选票(关于一个好问题)。但是话又说回来,通过审查您的其他问题并投票(视情况而定),无论如何您都会公正地对待它们。

标签: perl grep regex-negation


【解决方案1】:

与同名命令行工具不同,grep 不采用正则表达式模式;它需要一个表达式,该表达式的计算结果为要保留的项目的真值。

$regex 有一个真值——编译的正则表达式模式不会字符串化为0 或空字符串——所以!$regex 总是假的,所以grep 过滤掉所有内容。您想要执行正则表达式匹配,因此您需要正则表达式匹配运算符。

my @wanted_array = grep  { !/$regex/ } @array;

还有第二个问题。

# An array that contains a single element: a reference to an anonymous array.
my @array = ['hard_link is not present', 'dynamic variable', 'segfault'];

应该是

# An array that contains a three strings.
my @array = ('hard_link is not present', 'dynamic variable', 'segfault');

【讨论】:

    【解决方案2】:

    首先,不要在脚本中使用-w(除非您是 2000 年之前的时间旅行者)。

    始终以 use strict; use warnings; 开头您的 Perl 文件。

    您的代码中的问题是您使用!$regex 作为过滤条件。 $regex 包含一个正则表达式对象,它是一个真值,因此否定它会返回假。这就是你最终得到一个空数组的原因。

    修复:实际上做一个正则表达式匹配:

    my @wanted_array = grep { !/$regex/ } @array;
    

    (这使用匹配运算符m//(但如果您使用/ 作为分隔符,m 是可选的。)


    另一个问题是你的@array 只包含一个元素,它是一个引用(对另一个数组)。

    你想要

    my @array = ('hard_link is not present', 'dynamic variable', 'segfault');
    

    [ ... ] 是单个标量值。

    【讨论】:

    • 谢谢@ikegami、melpomene 和 zdim,它成功了。但是我注意到即使我将 $regex 作为字符串传递,它的工作方式也是一样的。我想知道这是否是个好主意
    • 很抱歉上述不完整的评论,但是我注意到即使我将 $regex 作为字符串传递,它的工作方式也是一样的。我想知道“我的 $regex = qr//”如何扮演不同的角色。我想知道这是否是个好主意?例如:我的 $regex = 'hard_link|无法重新分配|全局变量|segfault';给出与以前相同的输出
    • @zdim 不,试试看。使用qr的原因是为了提前编译正则表达式,保证只需要编译一次
    • @SinanÜnür 是的,谢谢……我已经经历过一次了。有些事情正则表达式与'' 一起工作,这让我很吃惊。我只喜欢 '' 用于文字,qr 用于正则表达式。总是。
    • @hitman99 我之前的评论是错误,因为在这种情况下'' 的工作方式与qr 一样。但是,它们有很大的不同,因为qr 正好用于正则表达式。见qr in perlop
    猜你喜欢
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 2022-01-13
    • 2014-09-21
    相关资源
    最近更新 更多