http://www.perlmonks.org?node_id=1075725


in reply to OS independent perl script

The hardest bit IMO isn't writing the perl code, it's making it executable on all the bizarro platforms that perl runs on. That is, to get the #! line right on Unix-a-likes, but make it a valid .BAT file on Windows, and whatever is needed on VMS.

Thankfully, there's a tool to do that.

ExtUtils::MakeMaker and, presumably, Module::Build, have the smarts to edit your scripts appropriately at install time so you don't have to worry about it. If for some reason you can't use either of those tools, then the maximally portable preamble for Unix-a-likes is:

#!/bin/sh exec perl -x $0 "$@" #!perl # your perl code goes here

but I have no idea what to do, or even if you can, make that also portable to other platforms.

Replies are listed 'Best First'.
Re^2: OS independent perl script
by Corion (Pope) on Feb 21, 2014 at 11:46 UTC

    For Windows, there is a really simple .cmd file that I use to launch a plain Perl script with the same name:

    @echo off perl -w %~dpn0.pl

    For a file test.cmd, this will launch perl -w test.pl in the same directory as test.cmd.

      Is %~dpn0 some bizarro shell magic then?

        Yep.

        %0 corresponds to $0, and the magic letters behind the tilde are explained (for example) here.

        See also  help for and Re: Command line arguments not passed in Win7 ( regqueryperl.bat ), Question on Strawberry's Portable .bat file

        @setlocal @set thisdir=%~dp0 @set thisfile=%~f0 @set thisfilebasename=%~n0 @set thisfilename=%~nx0 @set thisfilecorion=%~dpn0.pl @set thisfilepl=%thisdir%%thisfilebasename%.pl @echo thisdir=%thisdir% @echo thisfile=%thisfile% @echo thisfilebasename=%thisfilebasename% @echo thisfilename=%thisfilename% @echo thisfilecorion=%thisfilecorion% @echo thisfilepl=%thisfilepl% @echo; @endlocal

        thisdir=D:\ thisfile=D:\this2.bat thisfilebasename=this2 thisfilename=this2.bat thisfilecorion=D:\this2.pl thisfilepl=D:\this2.pl

        And the advanced broken version (for stupid paths )
        ^ is trickier than the others ... above escaping useful for example if you're  echo %stuff% >> otherfile.bat
        yes, cmd.exe is a mess

        @setlocal @set "thisdir=%~dp0" @set "thisfile=%~f0" @set "thisfilebasename=%~n0" @set "thisfilename=%~nx0" @set "thisfilecorion=%~dpn0.pl" @set "thisfilepl=%thisdir%%thisfilebasename%.pl" @echo thisdir="%thisdir% @echo thisfile="%thisfile% @echo thisfilebasename="%thisfilebasename% @echo thisfilename="%thisfilename% @echo thisfilecorion="%thisfilecorion% @echo thisfilepl="%thisfilepl% @echo; @set "thisfile=%~f0" echo %thisfile% @set "thisfile=%thisfile:^=\^%" @set "thisfile=%thisfile:>=^>%" @set "thisfile=%thisfile:<=^<%" @set "thisfile=%thisfile:&=^&%" @set "thisfile=%thisfile:|=^|%" @set "thisfile=%thisfile:)=^)%" @set "thisfile=%thisfile:(=^(%" @set "thisfile=%thisfile:[=^[%" @set "thisfile=%thisfile:]=^]%" @set "thisfile=%thisfile:"=\"%" @echo escaped-thisfile "%thisfile%" @echo; @endlocal

        $ "D:\pa^th\this2.bat" thisdir=D:\path\ thisfile=D:\path\this2.bat thisfilebasename=this2 thisfilename=this2.bat thisfilecorion=D:\path\this2.pl thisfilepl=D:\path\this2.pl