我可以使用<>
在那里循环输入到 perl 程序的管道。但是如何确定是否有流水线输入,如果没有流水线输入,我将使用环境变量来加载文件。我正在尝试使用:
my @lines = (<>);
if ($#lines == -1) {
use setenv;
open FILE, "$ENV{'ART_FILE_LIST'}" or die $!;
@lines = <FILE>;
}
显然它不起作用,因为程序会在第一行等待
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
}
您可以使用 -t 运算符来查看您是否是终端,即不是管道:
if (-t STDIN) { print "Terminal\n" }
else { print "Not a terminal\n" }
perl -Mylib -e 'Mylib::do_stuff' --i_am_pipe_lined
UNIX 管道的一件事是,它们通过不关心它们之前或之后的内容来实现其有用性。他们只是有工作要做,他们做到了。他们只做一件事,但他们都有开关来完成他们的简单工作,需要更多的定制。