如何确定某个值是否在Perl数组中?

Phi*_*son 1 regex arrays perl

我正在使用这个小片段来确定URL当前是否存储在数组中:

if( $self->{_local} eq "true" && ! grep {m|^$new_href?$|} @m_href_array ) {
    push( @m_href_array, $new_href );
    push( @href_array, $new_href );
}
Run Code Online (Sandbox Code Playgroud)

它似乎工作,但然后我的代码抛出一个错误说:

Sequence (?$...) not implemented in regex; marked by <-- HERE in m/^javascript:SearchGo(?$ <-- HERE / at C:/Perl/site/lib/ACTC.pm line 152, <> line 1.

任何人都可以解释为什么会这样吗?

Eth*_*her 6

在数组中搜索字符串时,您可以使用eq而不是正则表达式:

grep { $_ eq $new_href } @m_href_array
Run Code Online (Sandbox Code Playgroud)

但是,如果您确实需要使用正则表达式(例如,您正在搜索与数组中的子字符串匹配的字符串,则应始终引用该字符串,以便字符串中嵌入的特殊字符不会产生不良影响:

grep { /\Q$substr\Esomething_else/ } @array
Run Code Online (Sandbox Code Playgroud)

此外,如果您关心的是价值是否存在,某处,您可以在找到匹配后立即短路:

use List::Util 'first';
if (first { $_ eq $new_href } @m_href_array) { ... }
Run Code Online (Sandbox Code Playgroud)

要么

use List::MoreUtils 'any';
if (any { $_ eq $new_href } @m_href_array) { ... }
Run Code Online (Sandbox Code Playgroud)

如果您要进行大量搜索,或者您的数组很长,那么您可以通过将数组转换为哈希来更快地完成该过程,因此您可以进行O(1)查找:

my %values_index;
@values_index{@array} = ();

if (exists $values_index{$element}) { ... }
Run Code Online (Sandbox Code Playgroud)