Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid

Read into stdin pipe characters

by w3ntp (Beadle)
on Oct 05, 2010 at 19:43 UTC ( #863668=perlquestion: print w/replies, xml ) Need Help??
w3ntp has asked for the wisdom of the Perl Monks concerning the following question:

I have a perl program that needs to read in characters that contain the "|" character without any "'s

If I have a simple program

#!/usr/local/bin/perl $stuff = @ARGV[2] print $stuff; exit
the program croakes when I pass it a b c|d|e|f
use of " is not allowed

any ideas?


Replies are listed 'Best First'.
Re: Read into stdin pipe characters
by toolic (Bishop) on Oct 05, 2010 at 20:07 UTC
      This input string does not contain quotes. Otherwise this would be easy

        You seem to be confusing the string and the literal (piece of shell code) that produces the string.

        The string may not have quotes, but the shell string literal that produces the string must use quotes or some alternative. For example, with bash, you could use any of the following shell commands: a b 'c|d|e|f' a b "c|d|e|f" a b c\|d\|e\|f

        In all cases, a string of four letters separated by pipes will be passed to Perl by the shell. print $ARGV[2] will result in the following:

        First, please use <code> tags for your code. It's very, very difficult to read your program.

        Are you sure the error is coming from perl? How are you passing pipe characters on the command line if you're not using quotes?

        Also, please "use strict;" and "use warnings;" before posting:

        #!/usr/local/bin/perl use strict; use warnings; my $stuff = $ARGV[2]; print $stuff; exit;


Re: Read into stdin pipe characters
by dasgar (Priest) on Oct 05, 2010 at 23:09 UTC

    First, I'm going to assume that you're running on a *nix platform based off of your shebang line.

    To call your script, you do have to encapsulate the desired pipe character inside of quotes. If you don't, the shell with believe that the pipe character is telling it to do something. Also, encapsulating it in quotes will not pass the quotes to your script.

    For example, let's say you try calling your program like this: perl b c|d|e|f. Here's how your shell will process that.

    1. Need to call the perl executable with parameters
    2. is the first parameter to pass
    3. b is the next parameter to pass
    4. c is the next parameter to pass
    5. Pipe that output to d
    6. Pipe that output to e
    7. Pipe that output to f

    In this case, I'd agree with ReturnOfThelonious that the error is from the shell and not your script. If you were instead to call your script like this : perl b "c|d|e|f", here's how your shell would process it.

    1. Need to call the perl executable with parameters
    2. is the first parameter to pass it
    3. b is the next parameter to pass
    4. c|d|e|f is the next parameter to pass

    Notice the lack of quotes in the last step? The quotes will basically tell the shell: "Hey, treat everything in side this quote as a parameter and DO NOT view this content as instructions for you to do". The quotes are not actually passed by the shell into your script. This is why toolic suggested that you "quote your passed strings".

    I apologize for the length of this post. But since you didn't seem to quite understand what toolic was suggesting, I thought I'd go the extra length to clearly explain the quoting from the shell's perspective.

Re: Read into stdin pipe characters
by mjscott2702 (Pilgrim) on Oct 06, 2010 at 08:02 UTC
    Further to previous posters' comments on quoting (for the shell) and using code tags, it would be useful to include the error, since it is almost certainly the *nix shell that is throwing the error. The perl script itself should happily read in any characters and not assign any special meaning to them (well, apart from eol and other "real" special characters)

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://863668]
Approved by lostjimmy
[vedagiri89]: hi all! i need your help
[vedagiri89]: i'm facing this issue: Attempt to reload aborted.\ nCompilation failed in require at /usr/lib64/perl5/ vendor_perl//APR. pm line 19.\nBEGIN failed--compilatio n aborted at /usr/lib64/perl5/ vendor_perl//APR. pm line 19.
[vedagiri89]: how do fix this issue
[choroba]: This usually happens when you have more than one version of Perl, and you mix the libraries
[hippo]: Which O/S?
[vedagiri89]: i have searched many forum...not getting resolutions
[vedagiri89]: centos
[Corion]: vedagiri89: Either what choroba said, or maybe you misspelled some module name (on Windows), like use Strict; or something like that.
[vedagiri89]: @choroba, what to do for that

How do I use this? | Other CB clients
Other Users?
Others rifling through the Monastery: (8)
As of 2018-06-19 11:17 GMT
Find Nodes?
    Voting Booth?
    Should cpanminus be part of the standard Perl release?

    Results (113 votes). Check out past polls.