BillKSmith has asked for the wisdom of the Perl Monks concerning the following question:

The match operator returns an (unspecified)false value when the match fails. Why is that value not stored in this case?
use strict; use warnings; use version '5.38'; use feature 'say'; use Test::More tests=>1; my @arry1 = ('string'=~ m/str/, 'second'); my @arry2 = ('string'=~ m/foo/, 'second'); # no value stored for failed match. is $arry2[1], $arry1[1];

RESULT

not ok 1 # Failed test at tryit2.pl line 10 # got: undef # expected: 'second' # Looks like you failed 1 test of 1.
Bill

Replies are listed 'Best First'.
Re: Failed match not stored
by jwkrahn (Abbot) on Apr 07, 2025 at 20:29 UTC

    In list context a failed match returns an empty list.

    Naked blocks are fun! -- Randal L. Schwartz, Perl hacker
      Thanks for the simple answer. The original problem was more subtle than my example, but in both cases, I failed to recognize the list context.
      Bill
Re: Failed match not stored
by duelafn (Parson) on Apr 08, 2025 at 00:09 UTC

    Thus, you can fix the issue in a couple ways. Explicitly forcing scalar context:

    use Test::More tests=>1; my @arry1 = (scalar 'string' =~ m/str/, 'second'); my @arry2 = (scalar 'string' =~ m/foo/, 'second'); is $arry2[1], $arry1[1];

    or choosing your false value (and implicitly forcing scalar context)

    use Test::More tests=>1; my @arry1 = (('string' =~ m/str/ or 0), 'second'); my @arry2 = (('string' =~ m/foo/ or 0), 'second'); is $arry2[1], $arry1[1];

    Good Day,
        Dean

      I already had a 'workaround' similar to your second solution. I will adopt your first suggestion because it explicitly addresses the real issue rather than working around it.
      Bill