Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl-Sensitive Sunglasses
 
PerlMonks  

Re: program cant find values that start with $

by sundialsvc4 (Abbot)
on Jan 31, 2020 at 02:13 UTC ( #11112151=note: print w/replies, xml ) Need Help??


in reply to program cant find values that start with $

Although I haven’t personally tested it, might not the \Q...\E business be a bit too extreme? Would not a simple backslash \$ been sufficient here?

(No ... nevermind who I am ... this is a serious question ...)

  • Comment on Re: program cant find values that start with $

Replies are listed 'Best First'.
Re^2: program cant find values that start with $
by LanX (Cardinal) on Jan 31, 2020 at 02:25 UTC
    Two different things!

    Escaping the dollar means that variable interpolation won't happen and only literal '$zoek' can match.

    quotemeta on the other hand escapes regex metas after inserting the content of $zoek

    "zoek" is Dutch for "search" and is literal user input via Tk. But a $ in input is also a meta which needs to be quoted.

    main::(-e:1): 0 DB<1> $x='.' DB<2> p 'a' =~ /$x/ 1 DB<3> p 'a' =~ /\Q$x/ DB<4> p '.' =~ /\Q$x/ 1 DB<5> p '.' =~ /$x/ 1 DB<6> p '.' =~ /\$x/ DB<7> p '$x' =~ /\$x/ 1 DB<8>

    Cheers Rolf
    (addicted to the Perl Programming Language :)
    Wikisyntax for the Monastery FootballPerl is like chess, only without the dice

      Another way to look at this is via the stringization of qr//:

      c:\@Work\Perl\monks>perl -wMstrict -le "my $x = '.'; print for qr{$x}, qr{\Q$x}, qr{\$x}, 'etc...'; " (?-xism:.) (?-xism:\.) (?-xism:\$x) etc...


      Give a man a fish:  <%-{-{-{-<

        Good point! ++

        Cheers Rolf
        (addicted to the Perl Programming Language :)
        Wikisyntax for the Monastery FootballPerl is like chess, only without the dice

Re^2: program cant find values that start with $
by jcb (Vicar) on Jan 31, 2020 at 05:08 UTC

    There are two different layers of processing here. First, Perl applies the standard interpolations for double-quoted ("qq") strings to get a regex. Second, Perl interprets the string it produced in the first step as a regex.

    The $ character is special in both of these contexts: in qq-string interpolation it introduces a variable substitution and in a regular expression (from which Perl regexes inherit their basic features) it is a special atom matching "end of line". The problem in this program is that we need to interpolate a string obtained from Tk such that when the user enters "abc$def", the regex engine will actually match that exact string, so we need the first step to produce 'abc\$def' with a backslash to escape the $ character. This is what quotemeta does, and using "\Q$foo\E" is shorthand for my $tmp = quotemeta $foo; and "$tmp" but probably more efficient.

    A simple \$ prevents the interpolation in the first step. Using "\$foo" happens to be equivalent to '$foo', which would be a fixed search pattern and unlikely to be useful in the questioner's program.

    Another option would be to document that the program accepts regexes instead of fixed strings and require the user to enter 'abc\$def' if a match for the literal string 'abc$def' is desired.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://11112151]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others perusing the Monastery: (6)
As of 2020-10-31 14:07 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    My favourite web site is:












    Results (290 votes). Check out past polls.

    Notices?