Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to: cat text | ./script.pl

Tags:

perl

readline

I started using Term::Readline recently, but now I realized cat text | ./script.pl doesn't work (no output).

script.pl snippet before (working ok):

#!/usr/bin/perl
use strict;
use warnings;

$| = 1;
while (<>) {
   print $_;
}

script.pl snippet after (working only interactively):

#!/usr/bin/perl
use strict;
use warnings;
use Term::ReadLine

$| = 1;
my $term = Term::ReadLine->new('name');
my $input;
while (defined ($input = $term->readline('')) ) {
   print $input;
}

Is there anything I can do to preserve this behavior (to have the lines printed) ?

like image 272
Kuncík Avatar asked Jun 22 '26 18:06

Kuncík


1 Answers

You need to set it up to use the input and output filehandles that you want. The docs don't spell it out, but the constructor takes either a string (to serve as a name), or that string and globs for input and output filehandles (need both).

use warnings;
use strict;

use Term::ReadLine;

my $term = Term::ReadLine->new('name', \*STDIN, \*STDOUT);

while (my $line = $term->readline()) {
    print $line, "\n";
}

Now

echo "hello\nthere" | script.pl

prints the two lines with hello and there, while scipt.pl < input.txt prints out the lines of the file input.txt. After this the normal STDIN and STDOUT will be used by the module's $term for all future I/O. Note that the module has methods for retrieving input and output filehandles ($term->OUT and $term->IN) so you can change later where your I/O goes.

The Term::ReaLine itself doesn't have much detail but this is a front end for other modules, listed on the page. Their pages have far more information. Also, I believe that uses of this are covered elsewhere, for example in the good old Cookbook.

like image 50
zdim Avatar answered Jun 24 '26 10:06

zdim



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!