比较Perl中的多个字符串

时间:2012-02-06 08:26:08

标签: perl

我的代码是这样的:

if ( $var eq "str1" || $var eq "str2" || $var eq "str3" )
{
...
}

有没有优化这个。 我想要这样的东西:

if ( $var eq ["str1" || "str2" || "str3"] ) {...}

5 个答案:

答案 0 :(得分:14)

根据字符串的内容,正则表达式非常方便:

if ($var =~ /^(str1|str2|str3)$/) { … }

如果做不到这一点,你可以看一下清单:

if (grep { $var eq $_ } qw{str1 str2 str3}) { … }

答案 1 :(得分:14)

在Perl 5.10或更高版本中:

if ($var ~~ [qw( str1 str2 str3 )]) { ...} 

~~运算符在其参数之间执行smart match

答案 2 :(得分:2)

  1. 使用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 ...成语更具描述性。

  2. 制作一个包含您想要匹配的所有字符串的键的哈希

    my %matcher;
    
    @matcher{qw{str1 str2 str3}} = ();
    
    if ( exists $matcher{$var} ) {
        ...
    }
    

    这具有设置时间和用于散列的存储器的成本的缺点,但优点是匹配时间更像是O(log N)。因此,如果您要测试的$var有很多不同的值,那么整体上可能会更快。

  3. 制作一个匹配所有字符串的正则表达式

    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)

我是半开玩笑,但这样做会:

use Quantum::Superpositions;

if ($x == any($a, $b, $c)) { ...  }

另见Perl Monks thread