2016-09-20 89 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但。

相關問題