in reply to Re: Re: Re: Re: Re: Portability question: Is there something like '#ifdef' in Perl?
in thread Portability question: Is there something like '#ifdef' in Perl?

Something like below, does not work either on WinXP/SP1 or Win2K/SP4. I tried it out from the command shell and perl is "This is perl, v5.6.0 built for MSWin32-x86"
[C:/tmp] cat x.pl my $ret = system ("D:\\Program Files\\bin\\t.pl"); if ($? !=0 ) { print "ERROR: ret=[$?], err msg [$!]\n"; } [C:/tmp] ./x.pl 'D:\Program' is not recognized as an internal or external command, operable program or batch file. ERROR: ret=[256], err msg [No such file or directory]
The file t.pl is just a line with 'print "hello world!\n";' and one of the soutions I see is to use the Win32::GetShortPathName function.
-sureshr
  • Comment on Re: Re: Re: Re: Re: Re: Portability question: Is there something like '#ifdef' in Perl?
  • Download Code

Replies are listed 'Best First'.
Re: Re: Re: Re: Re: Re: Re: Portability question: Is there something like '#ifdef' in Perl?
by BrowserUk (Patriarch) on Sep 30, 2003 at 21:26 UTC

    You need to quote the command as well if it contains spaces. ie. This will work as. The inner, backslash-escaped quotes will be passed to the shell.

    my $ret = system( "\"D:\\Program Files\\bin\\t.pl\"" );

    However, rather than having to escape the inner quotes and double the backslashes, it's easier to make use of perls profusion of quoting operators.

    my $ret = system( q[ "D:\Program Files\bin\t.pl" ]);

    or

    my $ret = system( '"D:\Program Files\bin\t.pl"' );

    As an example

    P:\test>copy con "d:\program files\test.pl8" print "Hi there! from $0"; ^Z 1 file(s) copied. P:\test>perl system( '"d:\program files\test.pl8"' ) and warn 'Failed with: ', $?; ^Z Hi there! from D:\program files\test.pl8 P:\test>

    Hope that clarifies things a bit.


    Examine what is said, not who speaks.
    "Efficiency is intelligent laziness." -David Dunham
    "When I'm working on a problem, I never think about beauty. I think only how to solve the problem. But when I have finished, if the solution is not beautiful, I know it is wrong." -Richard Buckminster Fuller
    If I understand your problem, I can solve it! Of course, the same can be said for you.

      That works and helps, thanks!
      -sureshr
Re: Re: Re: Re: Re: Re: Re: Portability question: Is there something like '#ifdef' in Perl?
by PodMaster (Abbot) on Oct 01, 2003 at 21:02 UTC
    Apparently you missed what I was saying (or I wasn't clear enough). Try this
    C:\>more foo bar baz.pl Cannot access file C:\foo C:\>more "foo bar baz.pl" print "foo bar baz.pl says hi"; C:\>perl my @args = ( $^X, 'foo bar baz.pl' ); warn " while going through the shell ret = ".system "@args"; warn " while avoding the shell ret = ".system {$args[0]} @args; __END__ Can't open perl script "foo": No such file or directory while going through the shell ret = 512 at - line 2. foo bar baz.pl says hi while avoding the shell ret = 0 at - line 3.
    See that special form of system? It completely avoids the shell, meaning, if $args[1] eq "ab cd ef" , then $args[0] (in this case $^X, ie perl), gets a single argument, just as if you said perl "ab cd ef". Read `perldoc -f exec' for the full details.

    MJD says "you can't just make shit up and expect the computer to know what you mean, retardo!"
    I run a Win32 PPM repository for perl 5.6.x and 5.8.x -- I take requests (README).
    ** The third rule of perl club is a statement of fact: pod is sexy.