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

Remove items from array in perl using logical OR

我有一个数组。我希望数组是这样的,它没有 $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 有一个真值——编译后的正则表达式模式不会字符串化为 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');

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

始终以 use strict; use warnings;.

开头您的 Perl 文件

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

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

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

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


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

你想要

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

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