in reply to Re: Scripts work when run individually but not when run as one compiled script
in thread Scripts work when run individually but not when run as one compiled script

In the s/// they do need to be forward slashes, not backslashes, which have a different meaning.

Of course the canonical form is s/pattern/replacement/, but the delimiters can be any other character except whitespace, even control characters(but not ^L or ^M := \r, ^J := \n which count as whitespace, too; maybe there are other exceptions), as well as balanced parens, braces and brackets:

qwurx [shmem] ~> perl -le '$_="foe"; s\oe\riend\; print' friend qwurx [shmem] ~> perl -le '$_="foe"; s^Toe^Triend^T; print' friend qwurx [shmem] ~> perl -le '$_="foe"; s^Woe^Wriend^W; print' friend # even this works qwurx [shmem] ~> perl -le '$_="foe"; s$oe$riend$; print' friend

Using a meta-character or a sigil as delimiter makes it unusable as such in the regex, which is why we generally don't do that.

Note that e.g. the ^T is the terminal's representation of "\ct" entered via <Ctrl>-v<Ctrl>-t in the shell on a Linux box.

perl -le'print map{pack c,($-++?1:13)+ord}split//,ESEL'

Replies are listed 'Best First'.
Re^3: Scripts work when run individually but not when run as one compiled script
by Laurent_R (Canon) on Jan 19, 2016 at 23:09 UTC
    but the delimiters can be any other character except whitespace
    You probably meant it implicitly, but delimiters cannot be word characters (or alphanumerical characters).

      You probably meant it implicitly, but delimiters cannot be word characters (or alphanumerical characters).

      Heheh, try it

      $ perl -le" $_ = q\e\; s OeOEO; print " E $ perl -MO=Deparse -le" $_ = q\e\; s OeOEO; print " BEGIN { $/ = "\n"; $\ = "\n"; } $_ = 'e'; s/e/E/; print $_; -e syntax OK $ perl -le" $_ = q 1e1; s 1e1E1; print " E $ perl -MO=Deparse -le" $_ = q 1e1; s 1e1E1; print " BEGIN { $/ = "\n"; $\ = "\n"; } $_ = 'e'; s/e/E/; print $_; -e syntax OK

        This trick appeared on September 19, 2006 on the fun with perl mailing list - Punctuation Free Quine:

        s zzs vvxv and s ZVZchr 122Zie and s ZVZchr 122Zie and s ZVZchr 122Zie and s SxSlcfirstSe and s YZZxZYvvxvYi and print z and s ZVZchr 122Zie and s ZVZchr 122Zie and s ZVZchr 122Zie and s SxSlcfirstSe and s YZZxZYvvxvYi and print

        <update>

        As you might expect from the wonderful perl documentation, this is documented. From perlop:

        s/PATTERN/REPLACEMENT/msixpodualgcer
        ...
        Any non-whitespace delimiter may replace the slashes. Add space after the "s" when using a character allowed in identifiers.
        </update>

        perl -le'print map{pack c,($-++?1:13)+ord}split//,ESEL'
        Alright, I was wrong, thank you for the correction. I am pretty sure I tested it once long ago and concluded that it did not work, but I guess my test was probably wrongly written.

        Surely I should have have better shut up rather than saying something wrong, but at least I learned something that I did not know. Thanks to both of you.