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

1) Use of single quotes: This is not possible, as I am generating the path at runtime based on some env vars and I think use of single-quotes would not expand the variables inside it.

2) I am not quite comfortable using 'command', because its like relying too much on a system file's existence (for example, lets say, MS decides to change the command.com's name, though very rare it maybe. I am very reluctant to use of such tied code, unless there is some pressing need). A function like 'system' is rather more guaranteed to not change over time or gets itself (functionality) modified in versions to come, if need be.

Anyhow, thanks for the pointers!

-sureshr
  • Comment on Re: Re: Re: Re: Portability question: Is there something like '#ifdef' in Perl?

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

    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.

      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.

        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.