Wie kann man wissen, ob es Pipelines Eingabe in ein Perl-Programm ist
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
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.