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

While building up regex strings, I came across this conundrum. For example,
my $x = "(quantifier)"; my %x = ( "1" => "(hash_value)" ); my $z = 'quantifier hash_value'; print "_$1_\n" if $z =~ /$x{1}/; # {1} is quantifier print "_$1_\n" if $z =~ /@{[$x{1}]}[0]/; # {1} is hash key __END__ _quantifier_ _hash_value_
(1) How does Perl disambiguate (a) exactly 1 occurence of $x and (b) the hash value $x{1}?

(2) You can see that Perl chooses (a) for /$x{1}/. If I want (b), is there a better way than @{[$x{1}]}[0]?

(3) If we had it to do over, is there a better way for Perl to resolve this?

-QM
--
Quantum Mechanics: The dreams stuff is made of

Replies are listed 'Best First'.
Re: Hash Key vs. Quantifier Ambiguity in Regex Context
by jarich (Curate) on Apr 01, 2004 at 00:08 UTC
    (2) You can see that Perl chooses (a) for /$x{1}/. If I want (b), is there a better way than @{[$x{1}]}[0]?

    Absolutely. Quote your hash key.

    my $x = "(quantifier)"; my %x = ( "1" => "(hash_value)" ); my $z = 'quantifier hash_value'; print "_$1_\n" if $z =~ /$x{'1'}/; # $x{'1'} is hash key __END__ _hash_value_

    Hope this helps.

    jarich

      Thanks! [Seems I've left my Obvious Hat at home today :( ]

      -QM
      --
      Quantum Mechanics: The dreams stuff is made of

Re: Hash Key vs. Quantifier Ambiguity in Regex Context
by kvale (Monsignor) on Apr 01, 2004 at 00:20 UTC
    (1) How regex strings are interpolated is a messy business. Usually it DWIM, but you hit a case where it doesn't. See Gory-details-of-parsing-quoted-constructs for more details.

    (2), I'd rename one of the x variables or do the interpolation my self:

    my $x = "(quantifier)"; my %x = ( "1" => "(hash_value)" ); my $z = 'quantifier hash_value'; my $ele = $x{1}; print "_$1_\n" if $z =~ /$ele/;
    For the third question, I'd probably play at perturbing perl's probabilistic parser, and not get anywhere :)

    -Mark

Re: Hash Key vs. Quantifier Ambiguity in Regex Context
by borisz (Canon) on Apr 01, 2004 at 00:13 UTC
    Use /$x{'1'}/ for the regex. Perl treat /$x{1}/ as match $x exactly 1 time {1}.
    Boris