2015-04-29 33 views
-1

我有一个数组有两个值,如果输入不在该数组中,需要执行一些操作。检查特定值不在数组中

我试着像

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

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

两种方法都没有奏效。任何人都可以帮忙吗?

+3

你提到的数组。我在代码中看不到数组。如果你真的是使用数组这可能帮助:http://stackoverflow.com/questions/2860226/how-can-i-check-if-a-perl-array-contains-a-particular-value – bloodyKnuckles

回答

5

$ a不在阵列中,如果它不同于第一个元素它与第二个元素不同。

if ($x ne 'value1' and $x ne 'value2') { 

对于任何大小的真正的数组:

if (not grep $_ eq $x, @array) { 

(我用$x而不是$a,为$a是特殊的 - 见perlvar

+2

储备和用于流量控制;在表达式中使用&& – ysth

+1

您应该避免使用'grep'此:https://metacpan.org/pod/release/THALJEF/Perl-Critic-1.125/lib/Perl/Critic/Policy/BuiltinFunctions/ProhibitBooleanGrep.pm –

+1

@ VadimPushtaev当你检查数组中是否有*是*时,这肯定是有效的,但在这种情况下,我们检查数组中是否有*不*,这必然需要迭代每一个元素。你可以使用'grep'或'List :: MoreUtils :: none',挑选你的毒药。 – ThisSuitIsBlackNot

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') 
+0

您应该避免使用'grep'此:https://metacpan.org/pod/release/THALJEF/Perl-Critic-1.125/lib/Perl/Critic/Policy/BuiltinFunctions/ProhibitBooleanGrep.pm –

+1

@VadimPushtaev:我认为*应该避免*夸大它。这只是* Perl Best Practices *的一个法令,其原因是'grep'比较列表中的所有*元素,而不管先前的匹配是否会使进程短路。只要记住这一点,'grep'就是这样做的好方法,特别是因为列表只有两个项目的长度,并且在从磁盘文件读取数据的任何代码中额外的计算都是微不足道的 – Borodin

-1

你的变量$a没有评估为array没有[INDEX]指数,但被视为标量。

两个值array

$array[0] = "X"; $array[1] = "Y";

@array = qw/X Y/;

条件检查使用if

if ($array[0] ne "Your-String" || $array[1] ne "Your-String")

+0

我认为示例代码的呈现方式假设'@ array'是'$ a'的值匹配的地方。这不是最清晰的示例代码,但OP应该是改变它的代码。 –

0

您还可以使用智能匹配运算符:

除非($ X ~~ [ '值1', '值'])

+0

如果/当它消失,我会想念一个“'~~'”。 @tobyink总是存在['match :: simple'](https://metacpan.org/pod/match:simple)。 –

+2

只是为了澄清@ G.Cito的评论面对面的人smartmatch要走了...... smartmatch是[在5.18.0标记实验(http://perldoc.perl.org/perl5180delta.html#The-smartmatch-family特性 - 现在是实验性的):“很显然,smartmatch几乎肯定会在未来发生变化或消失,不推荐依赖其当前行为。” – ThisSuitIsBlackNot

+0

@ThisSuitIsBlack不用了,谢谢,我在回复中试图澄清一点。引导p5p perlmonks和@ikegami @leont,似乎我们可能希望在未来版本的Perl中使用更简单的'~~'版本 - 其行为可以通过公用程序模块和CPAN生态系统进行增强和扩展。 /我穿过手指 –

1

建立在smartmatch溶液@Dilbertino(不错缺口)使用match::simple通过@tobyink缓解smartmatch要离开的痛苦(我想念它已经):

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); 

match::simple|M|操作员可以用match功能来代替其加速了一点(它是用XS实现的):

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控制着行为。与match::simple如果您匹配RHS上的数组它应该是一个arrayref。

Smart::Match也具有none功能。要使用它,你会怎么做:

if ($x ~~ none (@array)) { 
    say "not here so do stuff ..."; 
} 

附录

这里讨论的Stackoverlfow(见:Perl 5.20 and the fate of smart matching and given-when?)和其他地方(CFPerlmonks article通过@ikegami从大约的perl-5.18)给出上下文为smartmatch实验。 TLDR;事情可能在未来发生变化,但与此同时,你可以去及时use match::smart qw(match);用perl-5.8.9再次证明perl永不死亡;它只是返回到它的生态系统。

今后类似Smart::Match。非核心CPAN模块没有这个概念),可以帮助增压与念想副词和形容词,并有额外的奖励辅助功能简化的智能匹配运算符(如我理解它)澄清/简化perl本身的东西,因为~~运营商的运营环境会较不明确。

+1

自从我的那些帖子以来,该话题还没有在p5p上再现。有兴趣的人需要加强 – ikegami

6

您可以使用List::MoreUtilsnone功能。

如果你真的有一个数组作为你的主题行说,那么你的代码看起来像这样

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 
} 
+0

++我从来没有想过这样,但[Smart :: Match'](https://metacpan.org/pod/Smart::Match)就像一个“Util”模块一样运作。它还有一个'none'函数,你可以这样做:'if($ x ~~ none(@array)){say“not here so so stuff”}'。这几乎就好像它对'~~'运算符的未来(非常简化)版本的'Match :: Util'增强一样。添加'Smart :: Match'作为回应。 –

+2

@ G.Cito:我喜欢提供智能匹配或与之相关的任何东西,这是一个非常广阔的泊位,我害怕使用Perl 6版本编写任意数量的代码。问题在于它试图成为一个* DWIM *操作符,并且不可能记住它与任何给定的参数组合有什么关系。我很快就会说出我的意思并得到正确的结果,并让其他人了解我的代码 – Borodin

+0

我可以看到它可能如此“聪明”,以致难以简化。简化某些东西可能很复杂,但需要很长时间才能做到。 –

0

我会做这样的事情使用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"; 
} 
+0

您应该避免使用'grep':https://metacpan.org/pod/release/THALJEF/Perl-评论家-1.125/lib中/的Perl /评论家/政策/ BuiltinFunctions/ProhibitBooleanGrep.pm –