I don't know if this needs submitted here, but I figured it wouldn't hurt. https://rt.cpan.org/Ticket/Display.html?id=51430
This is a one line fix for Net::LDAP::FilterMatch. Using the SYNOPSIS code from Net::LDAP::FilterMatch, the results for the ldap entry: dn: cn=dummy entry cn: dummy entry street: 1 some road street: nowhere Are : (cn=dummy*) : no match (ou=*) : no match (&(cn=dummy*)(street=*road)) : no match (&(cn=dummy*)(!(street=nowhere))) : no match They should be: (cn=dummy*) : match (ou=*) : no match (&(cn=dummy*)(street=*road)) : match (&(cn=dummy*)(!(street=nowhere))) : no match I tracked this down to Net::LDAP::FilterMatch::_cis_substrings. This line: return grep(/\Q$regex\E/i, @_) ? 1 : 0; Should be: return grep(/$regex/i, @_) ? 1 : 0; The reason the quoting isn't needed, is because it's already done in _filterMatch() on the line: $assertion = join('.*', map { "\Q$_\E" } map { values %$_ } @{$args->{'substrings'}}); If that is then \Q...\E again, then the ".*" will get regex escaped, and breaks. This change may affect the following lines: *_caseIgnoreIA5SubstringsMatch = \&_cis_substrings; *_caseIgnoreSubstringsMatch = \&_cis_substrings; I'm didn't dig into those, but they may need a separate subroutine doing what the old one did. Thanks, -- Josh I.