Как узнать, есть ли входные конвейеры в программу Perl - PullRequest
1 голос
/ 20 ноября 2010

Я могу использовать <> для зацикливания конвейерного ввода в perl-программу.Однако, как я могу решить, есть ли конвейерный ввод, если нет конвейерного ввода, я буду использовать переменную окружения для загрузки файла.Я пытаюсь использовать:

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

Очевидно, что это не работает, потому что программа будет ждать в первой строке

Ответы [ 3 ]

2 голосов
/ 20 ноября 2010
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 голос
/ 20 ноября 2010

Вы можете использовать оператор -t, чтобы узнать, являетесь ли вы терминалом, т.е. не конвейером:

if (-t STDIN) { print "Terminal\n" } 
        else { print "Not a terminal\n" }
0 голосов
/ 20 ноября 2010

Использование Getopt::Long

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

Одна из особенностей конвейеров UNIX заключается в том, что они достигают своей полезности, не заботясь о том, что находится до или после них.У них просто есть работа, и они делают это.Они просто делают одну вещь, но у них всех есть переключатели, которые выполняют свою простую работу с чуть большей настройкой.

...