使用逻辑OR从perl中的数组中删除项
我有一个数组。我希望数组不包含任何$regex值(以逻辑或方式)。 我以否定的方式使用grep命令,但我认为这并不能解决我的问题。非常感谢您的帮助。谢谢使用逻辑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
#!/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的。看见