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

Hi Brethern,
I have just re-installed windows XP (a few weeks back) and the latest Activestate Perl 5.12.2
When I run Hello World:
#!/usr/bin/perl print("hello world \n");
I Get:
D:\dev\test>hi.pl Microsoft Windows XP [Version 5.1.2600] (C) Copyright 1985-2001 Microsoft Corp. D:\dev\test>
It seems to have launched a new command shell. Its exactly the same as I get if I type 'cmd'...
Any ideas brethern? AVG reports no visrus...

Replies are listed 'Best First'.
Re: Simnple script not working - Perl on XP
by Utilitarian (Vicar) on Jan 11, 2011 at 14:59 UTC
    You have associated cmd with .pl files. Try
    D:\dev\test>perl hi.pl
    print "Good ",qw(night morning afternoon evening)[(localtime)[2]/6]," fellow monks."
      Ah Ha!
      Thanks you that is it.
      In the past putting .pl always worked OK so I didn't think of that...
      Cheers!
      z
Re: Simnple script not working - Perl on XP
by mikeraz (Friar) on Jan 11, 2011 at 17:37 UTC

    As an anonymous monk pointed out, the following is wrong.

    In a Windows environment it is sometimes(?) required to replace
     #!/usr/bin/perl
    with
     #!perl
    Then you can just hi.pl


    Be Appropriate && Follow Your Curiosity
      Thanks for that I realize the line isn't really necessary, but its habit.
      Most or all my perl scripts end up being run on Linux.
      I went into the file manager > file type associations and changed the .pl to Perl, so I can just type 'hi.pl' and it runs ok.

      I think what happened was when ActivePerl got deleted before reinstalation, or my reinstall of XP, the .pl got associated with Command Interpreter cos Perl didn't exist - sounds plausible. The association was not made again when Perl was re-installed - until I manually fixed it.
      That's not the case. Perl on Windows parses the line for command-line-like flags because it has to (so -w and -l and -T and so forth will work), but since Perl is already running, it doesn't care about what binary the script claims should be invoked.
        it doesn't care about what binary the script claims should be invoked

        Interestingly enough, it *does* care about the name of the binary, but only to the extent that it matches /perl/i.
        If you try running a script that begins with #! xxxxx (where 'xxxxx' stands for any string of characters that does *not* match /perl/i) then all you'll get is a "Can't exec xxxxx ...." error.

        This wasn't always the case, but has been since at least perl-5.8.0

        Update: And if 'xxxxx' happens to be the name of a non-perl binary that *does* get found, then things might (or might not) get a little crazy:
        C:\_32\pscrpt>type try.pl #! gcc -w print "ok\n"; C:\_32\pscrpt>perl try.pl C:\_32\pscrpt>try.pl: file not recognized: File format not recognized collect2: ld returned 1 exit status C:\_32\pscrpt>
        Cheers,
        Rob
        I believe one of the major web servers uses that info, so while the switch wouldn't help in this situation, it could help in others.