2010-11-19 2 views
1

Ich kann <> verwenden, um dort die Pipeline-Eingabe zu einem Perl-Programm zu loopen. Wie kann ich jedoch entscheiden, ob es Pipeline-Eingabe gibt, wenn es keine Pipeline-Eingabe gibt Ich verwende Umgebungsvariable, um eine Datei zu laden. Ich versuche zu verwenden:Wie kann man wissen, ob Pipelines Eingang in ein Perl-Programm sind

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

Offensichtlich ist es nicht funktioniert, weil das Programm in der ersten Zeile wartet

+0

Das 'setenv verwenden' tut nichts. – tchrist

+0

Verwenden Sie setenv ist mein benutzerdefiniertes Modul zum Einrichten von Umgebungsvariablen einschließlich ART_FILE_LIST. Es ist in der Tat nicht relevant für die Frage. –

Antwort

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

es funktioniert. Danke. Nur ein Tippfehler: "Verwenden Sie offene qr " sollte "verwenden öffnen qw " –

+0

@ user391227, froh, dass es funktioniert hat. Das 'qr //' Ding muss "Muskelgedächtnis" sein: Ich habe in letzter Zeit viel mehr 'qr's als' qw's getippt. Das ist zumindest das zweite Mal, dass ich das in so vielen Tagen gemacht habe. Aber ich habe 100 'qr's pro Tag eingegeben. Es tut uns leid! – tchrist

+0

BTW, können Sie mir bitte mitteilen, was macht END {} Block? –

1

Sie den -t Operator verwenden können, um festzustellen, ob Sie ein Terminal sind, das heißt, nicht eine Pipeline:

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

Wäre das Überprüfen von '-t STDIN' nicht besser? (Hinweis: Ich bin kein Perl-Experte) http://stackoverflow.com/questions/518992 – thejh

+0

Guter Punkt, edited. – ergosys

0

Verwenden Getopt::Long

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

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

+0

Was macht 'ylib.pm'? – tchrist

+0

@tchrist: Es ist ein bisschen wie 'oose.pm'. Ich habe '-MMylib' für einen generischen Mod geschrieben, und ich habe einfach das' oose' Aussehen bevorzugt. Mylib würde die Definition für "do_stuff" enthalten. Für eine Reihe von Aufgaben, die ich für die Befehlszeile entwickle, entwickle ich lieber * in * ein Modul, das unter verschiedenen Umständen aufgerufen werden soll und dann einen '-e'-Ausdruck verwendet, um es abzuschalten, anstatt ein einzelnes Skript zu schreiben. Ich denke, es macht es mehr anpassbar als ein Skript. YMMV – Axeman

+0

@tchrist: Ich finde es einfacher, Bausteine ​​und einige Dinge zu machen, die auf einer Kommandozeile viel einfacher aussehen - zum Beispiel '-e 'pipelined => 1'', indem man sie von Anfang an mit einem Gebäude anspricht - Blockdesign. – Axeman

Verwandte Themen