in reply to Re: Re: question on sed
in thread question on sed

The version above uses the three-element form of open() (available in perl 5.6.0 and later), which is a bit safer than the two-element form. open(FH, '<', $filename) is the same as open(FH, "<$filename"). The problem is that $filename could have a '<' at the beginning, thus changing the meaning of the open(). The three-element form avoids this problem.

And yes, $c and $b need to have special regex characters escaped. (As broquaint said, variables like $c and $b have special meanings and should be avoided, but let's ignore that for the moment). If '/' is your only problem character, you can use the 'choose your own quotes' feature of Perl's regexen, such as s!$c!$b!g. In this case, the regex substitution will use '!' as a delimiter instead of '/'.

----
I wanted to explore how Perl's closures can be manipulated, and ended up creating an object system by accident.
-- Schemer

Note: All code is untested, unless otherwise stated

Replies are listed 'Best First'.
Re: Re: Re: Re: question on sed
by halley (Prior) on May 15, 2003 at 16:44 UTC

    Unless you're building the patterns in strings to be eval'd, you don't need to escape the slashes.

    In the original example, a sed command was being built, so $b and $c were interpolated by the shell or before the shell saw it, not by sed. Thus, the first thing sed sees has already been interpolated, which causes problems if the $b and $c had the separators in them.

    Your example in Perl should be fine, even if the $b and $c had slashes in them. The qq-like interpolations of the pattern and replacement arguments are done after the compiler has already parsed the s/// operator and gathered the arguments.

    It's still a good idea to escape things in the patterns, s/\Q$b/$c/ or $b = quotemeta $b, but that's to avoid problems with regex special characters, not the separators in the s/// operator.

    % perl $raw = 'this/is/a/test'; $b = 'is/a'; $c = 'was/a'; $raw =~ s/$b/$c/g; print $raw, $/; # this/was/a/test

    --
    [ e d @ h a l l e y . c c ]