How do I pipe some output to screen and some other selected output, out of the Perl script?
By using different file handles.
By default you'll have both STDOUT
and STDERR
. The print
function in Perl is really short hand for print STDOUT
.
In your terminal STDOUT
is given the file handle 1
and STDERR
is given the file handle 2
.
Here's an example of printing to each file handle and redirecting each to /dev/null.
$ perl -e 'print STDOUT "foo\n"; print STDERR "bar\n";'
foo
bar
$ perl -e 'print STDOUT "foo\n"; print STDERR "bar\n";' 1> /dev/null
bar
% perl -e 'print STDOUT "foo\n"; print STDERR "bar\n";' 2> /dev/null
foo
- The first command prints both.
- The second command throws away
STDOUT
and prints onlySTDERR
- The third command throws away
STDERR
and prints onlySTDOUT
You can also declare your own file handles (e.g., a log file) and print to that instead. See perldoc -f open
.
-
I cant run perldoc, the system crashes. Could you note how to declare my own non-file handle? – john-jones Jul 17 '12 at 19:45
-
-
i know that, there is STDOUT and STDERR, but i need to make my own, third handle which i can pipe specifically out of the program. – john-jones Jul 17 '12 at 19:47
-
Maybe you can clarify your question with some example code and where you want the output to go. – bahamat Jul 17 '12 at 19:49
-
I want some output to go to the screen, and some to be piped by 'number> some_bash_script'. Sorry but the sample code is exactly what I'm missing. – john-jones Jul 17 '12 at 19:52
you probably want to read the perlipc documentation, in particular the section on Named Pipes.
http://perldoc.perl.org/perlipc.html#Named-Pipes
perlipc - Perl interprocess communication (signals, fifos, pipes, safe subprocesses, sockets, and semaphores)
If you need two-way (read & write) communication with an external program, then the IPC::Open2 or IPC::Open3 modules (standard perl lib, also documented in the URL above) will be useful.