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

3
有没有办法在perl中做类似这样的事情?
$str = "A"
print "Yes" if $str in ('A','B','C','D');

smartmatch ~~ 但它是实验性的。 - mkHun
有没有办法使用匿名数组,还是必须像我在答案中所做的那样? - CJ7
1
@CJ7:虽然不相关,但我注意到你提出的大多数问题都处于开放状态。如果您对答案满意,请接受它们以关闭这些问题。谢谢。另请参阅:http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work - Chankey Pathak
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Zaid
3个回答

8
智能匹配是实验性质的,在未来的版本中可能会更改或消失。在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,它更快,因为它在找到匹配项时停止迭代。

我正在使用perl v5.16.3,没有收到任何警告。 - CJ7
因为它在5.18+版本中已被弃用。 - Chankey Pathak
1
List::Util::first和List::Util::any都会在找到匹配项后立即停止迭代,所以我不确定为什么你提供first作为替代方案。如果列表元素可以为假值,则first还要求您检查未定义:say“match”if defined first { ... } @array与简单的say“match”if any { ... } @array - ThisSuitIsBlackNot

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一样,有许多不同的方法可以做到这件事。

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

1
如果使用智能匹配,print "Yes" if 'A' ~~ ['A','B','C','D']; 也可以工作,但这可能不是最好的选择。 - reflective_mind

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接