2010-11-19 31 views
1

我可以使用<>来将流水线输入循环到perl程序。但是,如何确定是否存在流水线输入,如果没有流水线输入,我将使用环境变量来加载文件。我试图使用方法:如何知道是否有流水线输入到perl程序

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

显然,这是行不通的,因为该计划将在第一行

+0

'使用setenv'什么也不做。 – tchrist 2010-11-19 22:48:00

+0

使用setenv是我的自定义模块来设置环境变量,包括ART_FILE_LIST。这与问题确实无关。 – 2010-11-22 13:30:36

回答

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 
} 
+0

它的工作原理。谢谢。只是一个错字:“使用打开的qr < :std :utf8>”应该是“使用打开qw < :std :utf8>” – 2010-11-21 23:39:09

+0

@ user391227,很高兴它的工作。 'qr //'必须是“肌肉记忆”:我最近一直在输入更多'qr'而不是'qw'。这至少是我在很多天里第二次做到这一点。但是我每天输入100'qr'。抱歉! – tchrist 2010-11-22 00:30:20

+0

顺便说一句,能否让我知道END {}块做什么? – 2010-11-22 13:38:15

1

可以使用-t操作者看到,如果你是一个终端,也就是等待,不是流水线:

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

不会检查'-t STDIN'会更好吗? (注:我不是一个Perl专家)http://stackoverflow.com/questions/518992 – thejh 2010-11-19 22:50:39

+0

好点,编辑。 – ergosys 2010-11-19 22:54:31

0

使用Getopt::Long

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

有关UNIX管道的一件事情是,他们通过不关心他们之前或之后的事情来实现他们的有用性。他们只是有工作要做,而且他们这样做。他们只做一件事,但他们都有交换机,可以做更简单的工作,并进行更多的定制。

+0

'ylib.pm'做了什么? – tchrist 2010-11-19 22:58:26

+0

@tchrist:有点像'oose.pm'。我为一个通用的mod编写了'-MMylib',我只是喜欢'oose'的外观。 Mylib将包含'do_stuff'的定义。对于我为命令行开发的许多任务,我更喜欢在一个模块中开发*,这个模块预计会在不同情况下被调用,然后使用一些'-e'表达式来启动它,而不是编写一次性脚本。我认为它比脚本更具可定制性。 YMMV – Axeman 2010-11-19 23:04:54

+0

@tchrist:我发现在命令行上构建块和一些看起来更简单的东西比较容易 - 例如'-e'通过从一开始就接近建筑物的流程来处理pipelined => 1'',块设计。 – Axeman 2010-11-19 23:07:40

相关问题