What happens to a non-matching regex in a Perl subroutine call? -


i'm trying make sense of what's happening non-matching regex in subroutine call. consider script:

sub routine{     print dumper(\@_); }  $s = 'abc123';  # these pass single element &routine &routine( $s =~ /c/ );      # 1. passes (1) &routine(2 == 3);           # 2. passes ('') &routine(3 == 3);           # 3. passes (1)  # following 2 calls appear identical  &routine( $s =~ /foobar/ ); # 4. passes () &routine();                 # 5. passes () 

in above script, numbers 1, 2 , 3 pass single value &routine. i'm surprised number 4 doesn't pass false value, rather passes nothing @ all!

it doesn't seem possible non-matching regex evaluates nothing @ all, since same sort of signature in conditional isn't valid:

# fine if( $s =~ /foobar/ ){    print "it's true!\n"; }  # syntax error if( ){    print "hmm...\n"; # :/ } 

what happens non-matching regex when it's used in subroutine call? further, possible &routine figure out whether or not it's been called non-matching regex, vs nothing @ all?

when match operator =~ used in list context returns list of matches. when there no matches list empty (also called empty list), , empty list passed sub routine in turn causes @_ empty.

if explicitly want pass false value of "did expression return matches?" need perform match in scalar context. can using scalar keyword

&routine( scalar $s =~ /foobar/ ); 

which pass value ''(false) routine sub. calling sub without arguments passes empty list, final example correctly written:

if ( () ) {    print "hmm...\n"; } 

which not syntax error because in perl 0, '', , () represent false.


Comments

Popular posts from this blog

PHP DOM loadHTML() method unusual warning -

python - How to create jsonb index using GIN on SQLAlchemy? -

c# - TransactionScope not rolling back although no complete() is called -