2015-07-02 12 views
16

Kiedy używam plików <stdin> w pliku Perla (*.pm), nie odczytuję danych wejściowych z klawiatury, ale kiedy używam <STDIN> w tym samym miejscu, to działa dobrze.Jaka jest różnica między <stdin> i <STDIN>?

Dlaczego nie dostaję wejście kiedy używam <stdin>?

+2

'stdin': Uwielbiam nieudokumentowane funkcje. Trzymaj się 'STDIN'A – tjd

Odpowiedz

21

STDIN jest udokumentowane uchwyt pliku. Istnieje również stdin, który jest aliasowany na STDIN, ale działa tylko w pakiecie main::: main::stdin jest taki sam jak main::STDIN (jak udokumentowano w perlop - Perl operators and precedence).

W pakiecie zatem

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

stdin jest interpretowany jako My::Package::stdin, która nie istnieje. Można użyć main::stdin z pakietu, ale przy użyciu standardowego STDIN (która zawsze wskazuje main::STDIN, nawet z pakietu) jest znacznie czystszy.

+2

wow, nie wiedziałeś o' stdin'! – ikegami

12

nie wiedział o tym, ale uznał to udokumentowane w jednorazowe pkt w perlop

The uchwytów plików STDIN, STDOUT i STDERR są predefiniowane. (Operatory plików: stdin, stdout i stderr będą działać również z wyjątkiem pakietów, gdzie będą interpretowane jako identyfikatory lokalne, a nie globalne.) Dodatkowe uchwyty plików mogą być tworzone między innymi za pomocą funkcji open(). Aby uzyskać szczegółowe informacje, patrz perlopentut i "open" w perlfunc.

+2

Dlaczego ktoś miałby to wiedzieć? – mob

+0

Właściwie to próbuję pomyśleć, jaki byłby sens robienia tego w pierwszej kolejności. Chodzi mi o to, że mogłem po prostu zobaczyć, dlaczego posiadanie aliasu z małą literą może mieć jakiś sens, ale nie jedno z innym zachowaniem. – Sobrique

+3

To prawdopodobnie historyczna rzecz, która jest starsza niż pakiety i nikt nie był na tyle zawracany, aby naprawić swoje zachowanie po wprowadzeniu pakietów. – choroba

Powiązane problemy