如何检查变量是否在列表中?

时间:2016-09-20 04:25:50

标签: list perl set

有没有办法在perl中做这样的事情?

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

3 个答案:

答案 0 :(得分:8)

智能匹配为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,因为它在找到匹配项时停止迭代会更快。

答案 1 :(得分:2)

您可以将数组转换为哈希值。然后你可以有效地(在恒定时间,或 O (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。

答案 2 :(得分:0)

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