It's easiest to understand if you realize that:
$var !~ s/H/W/;
is equivalent to:
(not ($var =~ s/H/W/))
That is, the only difference between !~ and =~ is the return value. The side effect of mutating the left hand side when evaluated is the same for both operators.
That is, !~ followed by a s/// expression can screw up the contents of the left hand side just as well as though you had used =~
This also explains the "null context" warnings. Since !~ has the same effect as =~ when you're ignoring the return value (as you are here), perl lets you know that you're probably doing something you didn't intend to do - people evaluate =~ just for the side effects all the time, but using !~ that way is a bit odd. Note that this code doesn't emit the same warning:
#!/usr/bin/perl -w use strict; my $var = "WooHoo\n"; print $var if $var =~ /^Woo/; print $var if $var !~ /^Hoo/; if ($var =~ s/W/H/) {print "=~ succeeded\n";} else {print "=~ failed\n";} print $var; if ($var !~ s/H/W/) {print "!~ succeeded\n";} else {print "!~ failed\n";} print $var;
-- @/=map{[/./g]}qw/.h_nJ Xapou cets krht ele_ r_ra/; map{y/X_/\n /;print}map{pop@$_}@/for@/
In reply to Re: Could some explain =~ vs !~ to me?
by fizbin
in thread Could some explain =~ vs !~ to me?
by Plankton
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |