2014-06-10 14 views
6

Quindi, ho usato <FILE> un numero elevato di volte. Un semplice esempio potrebbe essere:Quindi cosa fa esattamente lo <FILE>?

open (FILE, '<', "someFile.txt"); 
while (my $line = <FILE>){ 
print $line; 
} 

Così, avevo pensato che l'utilizzo di <FILE> avrebbe preso aa parte di un file alla volta (una linea in particolare) e usarlo, e quando è stato chiamato di nuovo, sarebbe vai alla riga successiva. E infatti, ogni volta che ho impostato <FILE> su uno scalare, è esattamente quello che farebbe. Ma, quando ho detto il computer una riga come questa:

print <FILE>; 

è stampato l'intero file, a capo e tutto. Quindi la mia domanda è: cosa pensa il computer quando ha superato lo <FILE>, esattamente?

risposta

12

L'operatore diamantato <> utilizzato per leggere dal file è in realtà la funzione integrata readline.

Da perldoc -f readline

Legge dal filehandle il cui typeglob è contenuto in ESPR (o da * ARGV se ESPR non viene fornita). Nel contesto scalare , ogni chiamata legge e restituisce la riga successiva fino al raggiungimento della fine del file, dopodiché la chiamata successiva restituisce undef. Nel contesto dell'elenco , viene letto fino al raggiungimento della fine del file e viene restituito un elenco di righe.

Se si desidera effettuare il check particolare contesto in perl,

sub context { return wantarray ? "LIST" : "SCALAR" } 

print my $line = context(), "\n"; 
print my @array = context(), "\n"; 
print context(), "\n"; 

uscita

SCALAR 
LIST 
LIST 
7

Dipende se è utilizzato in un contesto scalare o in un contesto di lista.

In contesto scalare: my $line = <file> legge una riga in pareggio.
Nel contesto elenco: my @lines = <FILE> legge l'intero file.

Quando dici print <FILE>; è il contesto dell'elenco.

2

Il comportamento è diverso a seconda del contesto, è stato valutato in:

my $scalar = <FILE>; # Read one line from FILE into $scalar 
my @array = <FILE>; # Read all lines from FILE into @array 

come print prende un l'argomento lista, <FILE> viene valutato nel contesto dell'elenco e si comporta in quest'ultimo modo.

Problemi correlati