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

Not sure if this is an actual problem, but it is an inconsistency in your logic:

... my $xlsx = $fp =~ s\csv\xlsx\; ... my $workbook = Excel::Writer::XLSX->new("$fp");

Should this not actually be

... my $xlsx = $fp; $xlsx =~ s/csv/xlsx/; ... my $workbook = Excel::Writer::XLSX->new("$xlsx");

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

Updated to reflect better information in discussion following.

But God demonstrates His own love toward us, in that while we were yet sinners, Christ died for us. Romans 5:8 (NASB)

Replies are listed 'Best First'.
Re^2: Scripts work when run individually but not when run as one compiled script
by shmem (Chancellor) on Jan 19, 2016 at 22:40 UTC
    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'
      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