in reply to PIPE problem

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?

Replies are listed 'Best First'.
Re: Re: PIPE problem
by graq (Curate) on Feb 22, 2003 at 07:31 UTC

    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