in reply to Invert grep match with qr// variable

Purely from a syntax point of view, the following would work:

my @res = grep { !/$tmp/ } @array;

There is no good general way to negate a (Perl) regular expression. Negative lookahead/lookbehind like (?! and (?<! will easily fail for (say):

use 5.020; use Data::Dumper; my $tmp = qr/re/; my @positive = grep {/$tmp/} 'rerere', 'foo'; my @negative = grep {/(?!$tmp)/} 'rerere', 'foo'; say Dumper \@positive; # 'rerere' say Dumper \@negative; # 'rerere', 'foo'

In the past, whenever I wanted this I've used an external variable for the grep result like this:

use 5.020; use Data::Dumper; my $tmp = qr/re/; my $reverse = 0; # my @positive = grep {!! /$tmp/ xor $reverse } 'rerere', 'foo'; $reverse = 1; my @negative = grep {!! /$tmp/ xor $reverse } 'rerere', 'foo'; say Dumper \@positive; # 'rerere' say Dumper \@negative; # 'foo'

Replies are listed 'Best First'.
Re^2: Invert grep match with qr// variable
by ikegami (Patriarch) on Feb 06, 2024 at 22:10 UTC

    There is no good general way to negate a (Perl) regular expression.

    See my answer.