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

You misunderstand. My use of the word "command" was simply as a placeholder for whatever command you are using system to invoke, ... NOT a reference to the old 16-bit windows shell, "command.com". Ie.

system( "command \\path\\with spaces\\file" );

could be

system( "notepad \\path\\with spaces\\file" );

or

system( "xcopy \\path\\with spaces\\file" );

The same applies to all other uses of the text 'command' in the original post.


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.

Replies are listed 'Best First'.
Re: Re: Re: Re: Re: Re: Portability question: Is there something like '#ifdef' in Perl?
by sureshr (Beadle) on Sep 30, 2003 at 21:05 UTC
    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

      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
      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.