2015-07-02 8 views
16

Wenn ich <stdin> in Perl-Modul (*.pm) Dateien verwenden, liest es nicht Eingabe von der Tastatur, aber wenn ich <STDIN> an der gleichen Stelle verwenden, funktioniert es gut.Was ist der Unterschied zwischen <stdin> und <STDIN>?

Warum wird keine Eingabe empfangen, wenn ich <stdin> verwende?

+2

'stdin': Muss undokumentierte Funktionen lieben. Stick mit 'STDIN' – tjd

Antwort

21

STDIN ist das dokumentierte Dateihandle. Es existiert auch stdin, was zu STDIN aliased ist, aber es funktioniert nur in dem main:: Paket: main::stdin ist dasselbe wie main::STDIN (wie in perlop - Perl operators and precedence dokumentiert).

In einem Paket daher

package My::Package; 
sub xx { 
    print while <stdin>; 
} 

stdin als My::Package::stdin interpretiert, die es nicht gibt. Sie können main::stdin aus einem Paket verwenden, aber mit dem Standard STDIN (die immer auf main::STDIN zeigt, sogar aus einem Paket) ist viel sauberer.

+2

wow, wusste nicht über' stdin'! – ikegami

12

Wusste nicht darüber, aber fand es in perlop

Die Dateihandies STDIN, STDOUT und STDERR sind vordefiniert in einer Wegwerf-Absatz dokumentiert. (Die Dateihandles stdin, stdout und stderr funktionieren auch, außer in Paketen, wo sie als lokale Bezeichner und nicht als globale Bezeichner interpretiert werden.) Zusätzliche Dateihandles können unter anderem mit der Funktion open() erstellt werden. Siehe perlopentut und "open" in perlfunc für Details dazu.

+2

Warum sollte jemand das wissen? – mob

+0

Ich versuche tatsächlich zu denken, was der Punkt, es überhaupt zu tun, wäre. Ich meine, ich könnte gerade sehen, warum ein kleingeschriebener Alias ​​sinnvoll ist, aber keinen mit anderem Verhalten. – Sobrique

+3

Es ist wahrscheinlich eine historische Sache, die älter ist als Pakete, und niemand war gestört genug, um sein Verhalten zu beheben, wenn Pakete eingeführt wurden. – choroba