2016-09-20 88 views
3

有没有办法在perl这样做?如何检查变量是否在列表中?

$str = "A" 
print "Yes" if $str in ('A','B','C','D'); 
+0

smartmatch'~~'但它是实验性的。 – mkHun

+0

有没有办法使用匿名数组,或者你必须做我在我的答案中做了什么? – CJ7

+1

@ CJ7:不相关,但我注意到,你问的大部分问题都处于开放状态。请接受这些问题的答案以关闭它们(因为您对答案感到满意)。谢谢。另见:http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work –

回答

0
$str = "A"; 
@arr = ('A','B','C','D'); 
print "Yes" if $str ~~ @arr; 
+1

'print“是”if'A'~~ ['A','B','C','D'] ;'也可以,但使用smartmatch可能不是最好的主意。 –

7

智能匹配是experimental,将变更或消失,在未来的版本。您将在Perl 5.18+版本中得到相同的警告。下面是选择:

使用grep

#!/usr/bin/perl 
use strict; 
use warnings; 
my $str = "A"; 
print "Yes" if grep {$_ eq 'A'} qw(A B C D); 

使用任何

#!/usr/bin/perl 
use strict; 
use warnings; 
use List::Util qw(any); 
print any { $_ eq 'A' } qw(A B C D); 

使用哈希

#!/usr/bin/perl 
use strict; 
use warnings; 
my @array = qw(A B C D); 
my %hash = map { $_ => 1 } @array; 
foreach my $search (qw(A)) #enter list items to be searched here 
{ 
    print exists $hash{$search}; 
} 

另请参阅:

  • match::smart - 提供匹配运算符| M |其行为与(比如Perl 5.18)实验性智能匹配算子或多或少相同。
  • Syntax::Feature::Junction - 提供关键字的任何,全部,无,或一个
  • 您也可以使用List::Util::first这是更快,因为它停止迭代,当它找到一个匹配。
+0

我使用的是perl v5.16.3,我没有收到任何警告。 – CJ7

+0

因为它在5.18+版本中已被弃用。 –

+1

List :: Util :: first和List :: Util :: any都会在找到匹配时立即停止迭代,所以我不确定为什么要提供'first'作为替代。 'first'还要求你检查undef是否有任何列表元素可能是虚假的:如果首先定义{...} @ array',则说'匹配',而不是简单地说'匹配'如果任何{...} @ array' – ThisSuitIsBlackNot

2

您可以将您的数组转换为散列。然后你可以有效地(在不变的时间内或者(1))检查你的字符串是否在原始数组中。下面是关于如何查找字符串'C'两种不同的方法:

#!/usr/bin/perl 
use strict; 
use warnings; 

my %hash1 = map {$_ => 0} qw/A B C D/; 
print 'Yes' if exists $hash1{'C'}; 

#!/usr/bin/perl 
use strict; 
use warnings; 

my %hash2; 
@hash2{qw/A B C D/} =(); 
print 'Yes' if exists $hash2{'C'}; 

当然像往常一样在Perl,TIMTOWTDI但。

相关问题