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

Hi Monks ! here is what I have :
my $updString = " desc table; "; my $command = qx[$updString | sqlplus -s userconn/passconn\@d2b]; system ("$command");
It keep complaining about the pipe in the command :
sh: Syntax error at line 2 : `|' is not expected.
do u see the error ,, thanks

Replies are listed 'Best First'.
Re: PIPE problem
by VSarkiss (Monsignor) on Feb 21, 2003 at 22:30 UTC

    It should be: my $updString = q{echo "desc table;"};Otherwise, the shell thinks the semicolon terminates the first command desc.

    Of course, that doesn't make much sense since you don't have a table name (you don't have a table named "table", right? ;-). So I suspect this copy-and-paste isn't exactly right. What are you really using?

      I'm not convinced that you are correct:  perl -e '$foo="tada;";print "$foo\n"'

      Your answer has nothing to do with the | (pipe) causing the error. Whether there is a table to describe or not, does not take away the fact that you can have as many semi-colons inside quotes as you like, Perl will not mind.

      [EDIT]
      Boy, there I was trying to make things clearer, and I muddy them, sorry.

      suekawar, maybe your problem stems from a lack of documentation. I found nowhere on PerlMonks or Perldoc.com that explains how qx works in any simple terms.

      perl -e ' > $foo = qx[ echo "Me Graq!" ]; > print "$foo"; > ' Me Graq!
      Try reading http://www.perldoc.com/perl5.8.0/pod/perlop.html#Quote-and-Quote-like-Operators.

      VSarkiss, I was trying to put across that for someone confused between system, qq and qx your answer might not be so clear.

      <a href="http://www.graq.co.uk">Graq</a>

        You are missing a critical point... qx/COMMANDLINE/ or system("COMMANDLINE") invokes /bin/sh with the -c option like so: (on WIN32, this is of course a little different)

        execl("/bin/sh", "-c", COMMANDLINE);

        The quotes in COMMANDLINE are not being ignored or parsed by Perl. They are being handled by /bin/sh. Notice that at a /bin/sh prompt, if you were to type:

        $ echo "Hello World" Hello World

        For the original example, the poster was trying to do:

        $ SQLCOMMAND; | sqlplus ...

        It should have been:

        $ echo "SQLCOMMAND;" | sqlplus ...

        The shell uses the quotes to group arguments. The quotes are not passed through to the command (again, under WIN32, this is a little more convoluted).

        The original problem posted was two-fold. First, as the initial responder suggested, the poster should have used 'echo "SQLCOMMAND;"' not 'SQLCOMMAND;'. As a later responder suggested, the poster should not be using both qx// and system() as both will execute the command. Either system() should be used if the output does not need to be intercepted, or qx// should be used if the output does need to be intercepted.

        thanks for the help
Re: PIPE problem
by BrowserUk (Patriarch) on Feb 22, 2003 at 02:48 UTC

    One problem is that qx[] is not what you think it is. It isn't used to build commands... its used to execute them. That is to say,

    $result = qx[some command string]; is equivalent to

    $result = `some command string`; and they are both (roughly speaking) similar in purpose to

    system('some command string');

    and you will only need to do one of them not qx// and system.

    Looking at your code, I think that you probably want q// (or possibly qq//) instead of qx//. That won't fix all the problems VSarkiss' point will also need fixing.

    Also whether system is the right choice will depend on how the commands you are using behave, but I am unfamilair with them, so I leave that to someone else.


    Examine what is said, not who speaks.
    1) When a distinguished but elderly scientist states that something is possible, he is almost certainly right. When he states that something is impossible, he is very probably wrong.
    2) The only way of discovering the limits of the possible is to venture a little way past them into the impossible
    3) Any sufficiently advanced technology is indistinguishable from magic.
    Arthur C. Clarke.
      thanks