使用逻辑OR

时间:2017-07-24 20:46:32

标签: perl grep regex-negation

我有一个阵列。我希望数组是这样的,它没有$ 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 = [];

2 个答案:

答案 0 :(得分:4)

与同名的命令行工具不同,grep不采用正则表达式模式;它需要一个表达式来评估要保留的项的真实值。

$regex具有真正的价值 - 已编译的正则表达式模式不会字符串化为0或空字符串 - 因此!$regex始终为false,因此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');

答案 1 :(得分:2)

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

始终使用use strict; use warnings;启动您的Perl文件。

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

修复:实际上正在进行正则表达式匹配:

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

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

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

你想要

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

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