检查不在数组中的特定值

时间:2015-04-29 12:56:57

标签: perl compare

我有一个包含两个值的数组,如果输入不在该数组中,则需要执行一些操作。

我试过

if ($a ne ('value1' || 'value2')

if (($a ne 'value1' ) || ($a ne 'value2' ))

这两种方法都不起作用。有人可以帮忙吗?

6 个答案:

答案 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'])