我正在使用这个小片段来确定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.
任何人都可以解释为什么会这样吗?
在数组中搜索字符串时,您可以使用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)