我有一个包含两个值的数组,如果输入不在该数组中,则需要执行一些操作。
我试过
if ($a ne ('value1' || 'value2')
if (($a ne 'value1' ) || ($a ne 'value2' ))
这两种方法都不起作用。有人可以帮忙吗?
答案 0 :(得分:7)
您可以使用List::MoreUtils
中的none
功能。
如果您的主题行确实有一个数组,那么您的代码将如下所示
use List::MoreUtils 'none';
if ( none { $_ eq $a } @array ) {
# Do stuff
}
或者如果你真的有两个常数,那么你可以使用这个
if ( none { $_ eq $a } 'value1', 'value2' ) {
# Do stuff
}
但在这种情况下,我更愿意看到
if ( $a ne 'value1' and $a ne 'value2' ) {
# Do stuff
}
答案 1 :(得分:5)
$ a不在数组中,如果它与第一个元素不同,它与第二个元素不同。
if ($x ne 'value1' and $x ne 'value2') {
对于任何大小的真实数组:
if (not grep $_ eq $x, @array) {
(我使用$x
代替$a
,因为$a
很特别 - 请参阅perlvar。)
答案 2 :(得分:4)
if ($a ne ('value1' || 'value2')
评估为
if ($a ne 'value1')
和
if (($a ne 'value1' ) || ($a ne 'value2' ))
始终为TRUE。
您可以尝试
if ($a ne 'value1' and $a ne 'value2')
或
if (!grep{$a eq $_} 'value1', 'value2')
答案 3 :(得分:1)
基于@Dilbertino的智能匹配解决方案(漂亮的昵称)使用@tobyink的match::simple
来缓解智能匹配消失的痛苦(我已经错过了):
use match::simple;
my @array = qw(abcd.txt abcdeff.txt abcdweff.txt abcdefrgt.txt);
my $x="abcd.txt" ;
say "it's there" if ($x |M| \@array );
来自|M|
的{{1}}运算符可以替换为match::simple
函数,可以加快速度(使用XS实现):
match
这很简单,因为RHS控制着行为。使用use match::simple qw(match);
my @array = qw(abcd.txt abcdeff.txt abcdweff.txt abcdefrgt.txt);
my $x="xyz.txt" ;
if ( match ( $x, \@array ) ) {
say "it's there!" ;
}
else {
say "no hay nada";
}
如果要匹配RHS上的数组,则它应该是一个arrayref。
Smart::Match
也有match::simple
功能。要使用它,你会这样做:
none
<强>附录强>
在这里讨论Stackoverlfow(参见:Perl 5.20 and the fate of smart matching and given-when?)和其他地方( c.f。来自@ perg-5.18的@ikegami的Perlmonks article)给出了smartmatch实验的背景。 TLDR; 将来可能会发生变化,但与此同时,您可以使用perl-5.8.9再次及时和if ( $x ~~ none (@array) ) {
say "not here so do stuff ...";
}
再次证明perl永远不会死;它只是回归其生态系统。
将来类似Smart::Match
(即。非核心CPAN模块而不是概念)可以帮助增强简化智能匹配运算符的辅助函数,如副词和形容词澄清/简化perl本身的事情有额外的好处(据我所知),因为use match::smart qw(match);
运算符的操作上下文不那么模糊。
答案 4 :(得分:1)
我会使用带有正则表达式匹配的grep来做这样的事情
#!/usr/bin/perl
use warnings;
use strict;
my @array = ('value1','value2');
if(grep(/\bvalue1\b|\bvalue2\b/, @array)){
print "Not Found\n";
}
else {
print "do something\n";
}
答案 5 :(得分:0)
您还可以使用智能匹配运算符:
除非($ x ~~ ['value1','value2'])