Frage

kann ich <> Schleife gibt die Pipeline Eingabe in ein Perl-Programm verwenden. Aber wie kann ich entscheiden, ob es Pipeline- eingegeben werden, wenn es kein Pipeline-Eingang ist, werde ich die Umgebungsvariable verwenden, um eine Datei zu laden. Ich versuche zu verwenden:

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

Natürlich ist es nicht funktioniert, weil das Programm in der ersten Zeile warten

War es hilfreich?

Lösung

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
}

Andere Tipps

Sie können den -t-Operator verwenden, um zu sehen, ob Sie einen Terminal ist, das heißt, nicht eine Pipeline:

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

Verwenden Sie Getopt::Long

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

Eines der Dinge, über UNIX-Pipeline ist, dass sie ihre Nützlichkeit erreichen, indem er nicht darum kümmern, was vor ihnen ist oder nach ihnen. Sie haben nur einen Job zu tun, und sie tun es. Sie haben eine Sache, einfach, aber sie haben alle Schalter ihre einfache Aufgabe mit einer wenig mehr Anpassung zu tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top