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

I want to remove A_D11 no A_D1, how do I remove the exact string? Thanks

my $a ="A_D[1]"; print "Removing $a from \$str\n"; my $str = "123 A_D1 XYZ A_D1[1] BLAH BLAH"; print "str = $str\n"; $str =~ s/\b$a / /; print "str = $str\n";

Replies are listed 'Best First'.
Re: Replacing string with []
by AnomalousMonk (Archbishop) on Oct 22, 2015 at 01:44 UTC

    c:\@Work\Perl\monks>perl -wMstrict -le "my $a = 'A_D1[1]'; ;; my $str = '123 A_D1 XYZ A_D1[1] BLAH A_D1[1] BLAH'; print qq{str = '$str'}; ;; $str =~ s{ \b \Q$a\E [ ] }{-}xmsg; print qq{str = '$str'}; " str = '123 A_D1 XYZ A_D1[1] BLAH A_D1[1] BLAH' str = '123 A_D1 XYZ -BLAH -BLAH'
    (Note that I used a '-' (dash) as the replacement character just to make the example more clear.) (Update: See discussion of  \Q \E and friends in Quote and Quote-like Operators section of perlop. See also quotemeta.)


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

Re: Replacing string with []
by choroba (Cardinal) on Oct 22, 2015 at 08:54 UTC
    Don't use $a as a lexical variable name. It's used by sort!
    لսႽ† ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ
Re: Replacing string with []
by Laurent_R (Canon) on Oct 22, 2015 at 08:10 UTC
    You have been given two fine solutions with the /Q ... /E and the quotemeta built-ins. These two constructs do all the dirty meta-character escaping work for you so that you don't have to worry about the details. And they are especially fine if you are given a search string (for example if it is coming from a file that you read or from user input).

    However, for the sake of completeness, I would add that these two operators simply add the \ escaping character before any non-word character (that may otherwise be interpreted as a regex meta-character). If you are building yourself your pattern, you might also add the escaping character before the [ opening square bracket yourself, as shown in the following session under the Perl debugger:

    DB<1> $str = "123 A_D1 XYZ A_D1[1] BLAH BLAH"; DB<2> $str =~ s/A_D1\[1]//g; DB<3> p $str 123 A_D1 XYZ BLAH BLAH
Re: Replacing string with []
by hdb (Monsignor) on Oct 22, 2015 at 07:22 UTC

    Also have a look at the quotemeta function.