1

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

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

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

4

3 回答 3

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
}
于 2010-11-19T22:54:23.340 回答
1

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

if (-t STDIN) { print "Terminal\n" } 
        else { print "Not a terminal\n" }
于 2010-11-19T22:48:44.073 回答
0

采用Getopt::Long

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

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

于 2010-11-19T22:55:24.377 回答