我有一个阵列。我希望数组是这样的,它没有$ 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 = [];
答案 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');
[ ... ]
是单个标量值。