匹配数组元素是否与字符串部分匹配?

Match if element of array is a partial match to a string?

我知道

if ( grep(/^$pattern$/, @array) ) {...}

如果在数组的一个元素中找到整个字符串,这将 return 为真。 但是,我试图弄清楚如果数组中的元素之一与字符串的末尾部分匹配,如何 return 为真。

例如:

my @array = (".com", ".net", ".org");
my $domain = "www.example.com";   #<--Returns True
   $domain = "www.example.gov";   #<--Returns False
   $domain = "www.computer.gov";  #<--Returns False, .com not at end

有没有更优雅的方法来做到这一点而不创建 foreach() 并对每个元素使用 m// 匹配?

怎么样

my @array = (".com", ".net", ".org");
my $pattern = join "|", map quotemeta, @array;

if ($domain =~ /(?:$pattern)$/)    # $ matches end of string

可以使用 List::Util

中的 any
if ( any { $re = quotemeta; $string =~ /$re$/ } @ary )  { ... }

$ 匹配字符串的末尾,因此上面的匹配任何 $string$re 模式在其末尾(无论该字符串之前出现什么)。 quotemeta 转义所有“ASCII non-word 字符”,因此(也)在正则表达式中具有特殊含义的事物。在这种情况下,它会将 .(匹配任何字符的模式)转换为 \.,一个文字点。

quotemeta 有一个可以在正则表达式中使用的 \Q ... \E 形式,对于

if ( any { $string =~ /\Q$_\E$/ } @ary )  { ... }

但要小心,不要逃避可能更复杂模式的其他部分。