2016-05-30 2 views
3

最近Term::Readlineを使い始めましたが、今はcat text | ./script.plが動作しない(出力なし)ことを実現しました。方法:cat text | ./script.pl

script.plは(作業OK)の前にスニペット:

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

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

script.plは(のみ対話的に取り組んで)後スニペット:

#!/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; 
} 

は、私は(この動作を維持するために何かできることはありますラインを印刷する)?

+0

STDINから読みたい場合は、STDINから読み込む必要があります。あなたは '$ interactive =!@ARGV && -t STDIN;'の振る舞いに基づいている可能性があります。 – ikegami

+1

あなたの質問のタイトルにCatの役に立たない使用の古典的な例。 https://en.wikipedia.org/wiki/Cat_%28Unix%29#Useless_use_of_cat – jira

+1

を参照してください。どこから読みたいのかを決めなければなりません: 'readline'を使うと、常に*/dev/tty * 。 '<>'または標準入力を使用する場合は、そうでないかもしれません。 – tchrist

答えて

2

必要な入出力ファイルハンドルを使用するように設定する必要があります。ドキュメントはそれを綴りませんが、コンストラクタは文字列(名前として機能する)か、文字列と入力ファイルと出力ファイルハンドルのためのglob(両方が必要です)のいずれかをとります。

use warnings; 
use strict; 

use Term::ReadLine; 

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

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

 
echo "hello\nthere" | script.pl 

scipt.pl < input.txtファイルinput.txtの行を出力しながら、hellothereとの2行を印刷します。この後、通常のSTDINSTDOUTは、将来のすべてのI/Oに対してモジュールの$termによって使用されます。このモジュールには、入出力ファイルハンドル($term->OUTおよび$term->IN)を取得するメソッドがあり、I/Oが後で変更できるようになっています。

Term::ReaLine自体は詳細はありませんが、これはページに記載されている他のモジュールのフロントエンドです。彼らのページにははるかに多くの情報があります。また、私はこれの使用が他の場所、例えば良い古いCookbookでカバーされていると信じています。

関連する問題