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

Trying to replace
&&
with
&
using $url =~ s/&&/&/; does not work. Someone can help me remove double ampersand from my URL?

Replies are listed 'Best First'.
Re: regex with special characrer help
by oko1 (Deacon) on Dec 02, 2008 at 14:11 UTC

    As linuxer has already noted - and as I suspect due to the name of your variable being '$url' - your input probably contains something other than just plain ampersands ("&"s, most likely.) This is one of those cases where either printing the variable content before you process it or using the Perl debugger (-d) is useful.

    If you find yourself actually dealing with individual ampersands, or character-by-character processing of any sort, you should consider using the 'tr///' operator instead of the 's///'; the former is much faster and more efficient, and it's all you need when you're dealing with processing characters rather than strings:

    $_ = '&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&'; tr/&/&/s; # The 's'quash modifier print;

    The output will be a single '&'.


    --
    "Language shapes the way we think, and determines what we can think about."
    -- B. L. Whorf
Re: regex with special characrer help
by Corion (Patriarch) on Dec 02, 2008 at 12:24 UTC

    Works for me:

    > perl -le "$_ = qq(Fire && ice); s/&&/&/; print" Fire & ice

    Maybe you can tell us in more detail how it fails for you. Maybe re-reading perlre, especially about the modifier flags of regular expressions helps, too. For example it might or might not be that your URL contains more than one pair of ampersands, and you want to replace them all.

Re: regex with special characrer help
by linuxer (Curate) on Dec 02, 2008 at 12:35 UTC

    How do you fill $url?

    If it is extracted from a HTML document it may be html encoded, so you won't find a literal '&&'; maybe a '&&'.

    It's hard to guess without knowing further details (Data source, script context, ...).