2015-07-02 24 views
16

Quando uso il <stdin> nel modulo Perl (*.pm) i file non leggono l'input dalla tastiera, ma quando uso <STDIN> nello stesso punto funziona correttamente.Qual è la differenza tra <stdin> e <STDIN>?

Perché non viene immesso input quando utilizzo <stdin>?

+2

'stdin': Devo amare le caratteristiche non documentate. Stick con 'STDIN' – tjd

risposta

21

STDIN è il filehandle documentato. Esiste anche stdin, che è aliasato a STDIN, ma funziona solo nel pacchetto main::: main::stdin è lo stesso di main::STDIN (come documentato in perlop - Perl operators and precedence).

In un pacchetto, pertanto,

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

stdin viene interpretato come My::Package::stdin, che non esiste. È possibile utilizzare main::stdin da un pacchetto, ma utilizzando lo standard STDIN (che punta sempre a main::STDIN, anche da un pacchetto) è molto più pulito.

+2

wow, non sapeva di' stdin'! – ikegami

12

non sapeva di questo, ma abbiamo trovato documentato in un paragrafo e getta in perlop

I filehandles STDIN, STDOUT e STDERR sono predefiniti. (I filehandle stdin, stdout e stderr funzioneranno anche a eccezione dei pacchetti, dove verranno interpretati come identificatori locali anziché globali.) Altri filehandle possono essere creati con la funzione open(), tra gli altri. Vedi perlopentut e "apri" in perlfunc per i dettagli su questo.

+2

Perché qualcuno dovrebbe saperlo? – mob

+0

In realtà sto provando a pensare a quale sarebbe il punto di farlo in primo luogo. Voglio dire, potrei quasi capire perché avere un alias minuscolo potrebbe avere un senso, ma non uno con un comportamento diverso. – Sobrique

+3

Probabilmente è una cosa storica che è più vecchia dei pacchetti e nessuno si è preoccupato abbastanza di risolvere il suo comportamento quando sono stati introdotti i pacchetti. – choroba