使用逻辑OR从perl中的数组中删除项

使用逻辑OR从perl中的数组中删除项,perl,grep,regex-negation,Perl,Grep,Regex Negation,我有一个数组。我希望数组不包含任何$regex值(以逻辑或方式)。 我以否定的方式使用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 reassi

我有一个数组。我希望数组不包含任何$regex值(以逻辑或方式)。 我以否定的方式使用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 = [];

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

$regex
有一个真值-编译的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');

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

始终使用
use strict启动Perl文件;使用警告

代码中的问题是您正在使用
$regex
作为过滤条件
$regex
包含一个regex对象,它是一个真值,因此对其求反将返回false。这就是为什么最终会得到一个空数组

修正:实际执行正则表达式匹配:

my @wanted_array = grep { !/$regex/ } @array;
(这使用匹配运算符
m/
(但是如果使用
/
作为分隔符,
m
是可选的。)


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

你想要

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

[…]
是单个标量值。

此外,
[…]
创建数组引用。您需要
@array=(…)
。因此
@array=[…]
创建该arrayref并将其分配给
@array
的第一个元素。我想这不是你想要的。提醒一下,看吧,我建议你仔细检查你的其他问题并投票(现在你已经有足够的信用了),然后接受合适的答案。这可能与你当前问题上奇怪的反对票有关,也可能与此无关。我在这里发表这篇评论并不是为了避免进一步的诽谤。当你看到这一点时,请告诉我。@zdim我对其他问题的投票对当前的投票结果有何帮助?老实说,我不知道这个问题到底是怎么回事。当然,其他问题对投票来说并不重要,但生活并不像我们所知道的那么简单。根据我的经验,人们不会撤回反对票。。。但这可能有助于未来的问题。如果这就是原因——我猜是因为我不理解那些投票(在一个好问题上)。但是再一次,通过回顾你的其他问题和投票(视情况而定),你无论如何都会公正地对待它们。谢谢你@ikegami,melpomene和zdim,成功了。但是我注意到,即使我将$regex作为字符串传递,它的工作方式也是一样的。我想知道对于上面不完整的注释,这是否是一个好主意,但是我注意到,即使我将$regex作为字符串传递,它的工作方式也是一样的。我想知道“my$regex=qr//”如何扮演不同的角色。我想知道这是否是个好主意?例如:my$regex='hard_link |无法重新分配|全局变量| segfult';提供与相同的输出before@zdim不,试试看。使用qr的原因是为了更早地编译regex,并保证只需要编译它once@Sinan是的,谢谢你。。。我已经经历过一次了。regex与
'
一起工作,这让我很困惑。我只喜欢
'
表示文字,而
qr
表示正则表达式。始终如此。@hitman99我之前的评论是错误的,因为在本例中,
'
的工作原理与
qr
的工作原理相同。但是,它们非常不同,因为
qr
正是针对regex的。看见