如何知道是否有输入到perl程序的管道

时间:2010-11-19 22:44:37

标签: perl input pipeline

我可以使用<>将管道输入循环到perl程序。但是,我如何判断是否有流水线输入,如果没有流水线输入,我将使用环境变量来加载文件。我正在尝试使用:

my @lines = (<>);
if ($#lines == -1) {
    use setenv;
    open FILE, "$ENV{'ART_FILE_LIST'}" or die $!;
    @lines = <FILE>;
}

显然它不起作用,因为程序将在第一行等待

3 个答案:

答案 0 :(得分:2)

use 5.010_000;

use utf8;
use strict;
use autodie;
use warnings qw<  FATAL all  >;
use open     qw< :std  :utf8 >;

END {
   close(STDOUT) 
       || die "can't close stdout: $!";
}


if (@ARGV == 0 && -t STDIN) {
    # NB: This is magic open, so the envariable
    #     could hold a pipe, like 'cat -n /some/file |'
    @ARGV = $ENV{ART_FILE_LIST} 
          || die q(need $ART_FILE_LIST envariable set);
}

while (<>) {
    # blah blah blah
}

答案 1 :(得分:1)

您可以使用-t运算符来查看您是否是终端,即不是管道:

if (-t STDIN) { print "Terminal\n" } 
        else { print "Not a terminal\n" }

答案 2 :(得分:0)

使用Getopt::Long

perl -Mylib -e 'Mylib::do_stuff' --i_am_pipe_lined

关于UNIX管道的一个问题是它们通过不关心它们之前或之后的内容来实现其有用性。他们只是有工作要做,他们这样做。他们做了一件事,简单地说,但是他们都有开关来完成他们简单的工作,只需要更多的定制。