http://www.perlmonks.org?node_id=305783


in reply to Re: Re: m//g behaves strange...
in thread m//g behaves strange...

You are very close to 100% right. However I do observe something else, and I don't let things escape easily.

If I do this:

use strict; use warnings; { $_ = "1234"; my $ret = /2/g; print "($ret)\n" } { $_ = "1234"; my $ret = /9/g; print "($ret)\n" }

The outputs are 1 and "empty string", which indicate that you are right.

However, try this:

use strict; use warnings; { my $a = 0; print "(" . ~$a . ")\n"; } { my $a = 1; print "(" . ~$a . ")\n"; } { my $a = ""; print "(" . ~$a . ")\n"; }

It returns:

(4294967295) (4294967294) ()

Remeber the return values for zero and empty string, and then try this:

use strict; use warnings; { $_ = "1234"; my $ret; print ~ m/2/, "\n"; } { $_ = "1234"; my $ret; print ~ m/9/, "\n"; }

It gives you:

4294967294 4294967295

Which indicates the "~" operator does receive 0, not "empty string". Rememebr that in the case that we explicitly pass "~" an empty string, it is not converted to 0

However, if we do this:

use strict; use warnings; { $_ = "1234"; my $ret; print ~ ($ret = m/2/), "\n"; print "($ret)\n"; } { $_ = "1234"; my $ret; print ~ ($ret = m/9/), "\n"; print "($ret)\n"; }

You get:

4294967294 (1) 4294967295 ()

It seems that although $ret receives "empty string", "~" operator receives 0, again rememebr that we didn't see this kind of auto-convertion in the explicitly-passing-empty-string case.