我的代码是这样的:
if ( $var eq "str1" || $var eq "str2" || $var eq "str3" )
{
...
}
有没有优化这个。 我想要这样的东西:
if ( $var eq ["str1" || "str2" || "str3"] ) {...}
答案 0 :(得分:14)
根据字符串的内容,正则表达式非常方便:
if ($var =~ /^(str1|str2|str3)$/) { … }
如果做不到这一点,你可以看一下清单:
if (grep { $var eq $_ } qw{str1 str2 str3}) { … }
答案 1 :(得分:14)
答案 2 :(得分:2)
使用List::MoreUtils qw{any}
use List::MoreUtils qw{any};
if ( any { $var eq $_ } 'str1', 'str2', 'str3' ) {
...
}
这可能比使用grep
更快,因为List::MoreUtils::any
在找到匹配时提前完成,而grep
可能会构建完整的匹配列表。我说“可能”因为Perl可以想象地优化if (grep ...
。它可能不会。但List::MoreUtils::any
确实提前完成,而且比if (grep ...
成语更具描述性。
制作一个包含您想要匹配的所有字符串的键的哈希
my %matcher;
@matcher{qw{str1 str2 str3}} = ();
if ( exists $matcher{$var} ) {
...
}
这具有设置时间和用于散列的存储器的成本的缺点,但优点是匹配时间更像是O(log N)。因此,如果您要测试的$var
有很多不同的值,那么整体上可能会更快。
制作一个匹配所有字符串的正则表达式
if ( $var =~ m/^str[123]$/so ) {
...
}
好的,如果您的字符串字面上是qw{str1 str2 str3}
,那么这很好,但如果它是一个任意字符串列表呢?
您可以使用Regexp::Assemble将一组正则表达式融合到一个优化的正则表达式中。
答案 3 :(得分:1)
有关固定字符串的列表,请将列表转换为哈希值。如果您要多次检查列表,以及列表是否变大,这将非常有用。
%on_my_list = map {; $_ => 1 } 'str1', 'str2', 'str3', ...;
if ($on_my_list{$var}) { ... }
答案 4 :(得分:0)