Perl - File I / O
Le basi per gestire i file sono semplici: associ un file filehandle con un'entità esterna (solitamente un file) e quindi utilizzare una varietà di operatori e funzioni all'interno di Perl per leggere e aggiornare i dati memorizzati nel flusso di dati associato al filehandle.
Un filehandle è una struttura Perl interna denominata che associa un file fisico a un nome. Tutti i filehandle sono in grado di accedere in lettura / scrittura, quindi puoi leggere e aggiornare qualsiasi file o dispositivo associato a un filehandle. Tuttavia, quando si associa un filehandle, è possibile specificare la modalità in cui il filehandle viene aperto.
Tre handle di file di base sono: STDIN, STDOUT, e STDERR, che rappresentano rispettivamente dispositivi di input standard, output standard e standard di errore.
Apertura e chiusura di file
Ci sono le seguenti due funzioni con più moduli, che possono essere usati per aprire qualsiasi file nuovo o esistente in Perl.
open FILEHANDLE, EXPR
open FILEHANDLE
sysopen FILEHANDLE, FILENAME, MODE, PERMS
sysopen FILEHANDLE, FILENAME, MODE
Qui FILEHANDLE è l'handle di file restituito da open funzione ed EXPR è l'espressione con nome file e modalità di apertura del file.
Apri funzione
Di seguito è riportata la sintassi per aprire file.txtin modalità di sola lettura. Qui il segno meno di <indica che il file deve essere aperto in modalità di sola lettura.
open(DATA, "<file.txt");
Qui DATA è l'handle del file, che verrà utilizzato per leggere il file. Ecco l'esempio, che aprirà un file e ne stamperà il contenuto sullo schermo.
#!/usr/bin/perl
open(DATA, "<file.txt") or die "Couldn't open file file.txt, $!";
while(<DATA>) {
print "$_";
}
Di seguito è riportata la sintassi per aprire file.txt in modalità di scrittura. Qui il segno meno di> indica che il file deve essere aperto in modalità di scrittura.
open(DATA, ">file.txt") or die "Couldn't open file file.txt, $!";
Questo esempio in realtà tronca (svuota) il file prima di aprirlo per la scrittura, il che potrebbe non essere l'effetto desiderato. Se desideri aprire un file in lettura e scrittura, puoi inserire un segno più prima dei caratteri> o <.
Ad esempio, per aprire un file per l'aggiornamento senza troncarlo:
open(DATA, "+<file.txt"); or die "Couldn't open file file.txt, $!";
Per troncare prima il file:
open DATA, "+>file.txt" or die "Couldn't open file file.txt, $!";
È possibile aprire un file in modalità di aggiunta. In questa modalità, il punto di scrittura verrà impostato alla fine del file.
open(DATA,">>file.txt") || die "Couldn't open file file.txt, $!";
Un doppio >> apre il file per l'aggiunta, posizionando il puntatore del file alla fine, in modo da poter iniziare immediatamente ad aggiungere informazioni. Tuttavia, non puoi leggere da esso a meno che non ci metti anche un segno più -
open(DATA,"+>>file.txt") || die "Couldn't open file file.txt, $!";
Di seguito è riportata la tabella, che fornisce i possibili valori delle diverse modalità
Sr.No. | Entità e definizione |
---|---|
1 | < or r Accesso in sola lettura |
2 | > or w Crea, scrive e tronca |
3 | >> or a Scrive, aggiunge e crea |
4 | +< or r+ Legge e scrive |
5 | +> or w+ Legge, scrive, crea e tronca |
6 | +>> or a+ Legge, scrive, aggiunge e crea |
Funzione Sysopen
Il sysopen è simile alla funzione principale di apertura, tranne per il fatto che utilizza il sistema open() funzione, utilizzando i parametri forniti come parametri per la funzione di sistema -
Ad esempio, per aprire un file per l'aggiornamento, emulando il file +<filename formato da aperto -
sysopen(DATA, "file.txt", O_RDWR);
O per troncare il file prima dell'aggiornamento -
sysopen(DATA, "file.txt", O_RDWR|O_TRUNC );
È possibile utilizzare O_CREAT per creare un nuovo file e O_WRONLY per aprire il file in modalità di sola scrittura e O_RDONLY per aprire il file in modalità di sola lettura.
Il PERMSL'argomento specifica i permessi del file per il file specificato, se deve essere creato. Per impostazione predefinita ci vuole0x666.
Di seguito la tabella, che fornisce i possibili valori di MODE.
Sr.No. | Entità e definizione |
---|---|
1 | O_RDWR Leggere e scrivere |
2 | O_RDONLY Sola lettura |
3 | O_WRONLY Solo scrittura |
4 | O_CREAT Crea il file |
5 | O_APPEND Aggiungi il file |
6 | O_TRUNC Tronca il file |
7 | O_EXCL Si ferma se il file esiste già |
8 | O_NONBLOCK Usabilità non bloccante |
Chiudi funzione
Per chiudere un filehandle, e quindi dissociare il filehandle dal file corrispondente, si utilizza il closefunzione. Questo svuota i buffer del filehandle e chiude il descrittore di file del sistema.
close FILEHANDLE
close
Se non è specificato alcun FILEHANDLE, chiude il filehandle attualmente selezionato. Restituisce true solo se è possibile svuotare correttamente i buffer e chiudere il file.
close(DATA) || die "Couldn't close file properly";
Lettura e scrittura di file
Una volta che hai un filehandle aperto, devi essere in grado di leggere e scrivere informazioni. Esistono diversi modi per leggere e scrivere i dati nel file.
L'operatore <FILEHANDL>
Il metodo principale per leggere le informazioni da un filehandle aperto è l'operatore <FILEHANDLE>. In un contesto scalare, restituisce una singola riga dal filehandle. Ad esempio:
#!/usr/bin/perl
print "What is your name?\n";
$name = <STDIN>;
print "Hello $name\n";
Quando si utilizza l'operatore <FILEHANDLE> in un contesto di elenco, restituisce un elenco di righe dal filehandle specificato. Ad esempio, per importare tutte le righe da un file in un array:
#!/usr/bin/perl
open(DATA,"<import.txt") or die "Can't open data";
@lines = <DATA>;
close(DATA);
Funzione getc
La funzione getc restituisce un singolo carattere dal FILEHANDLE specificato o STDIN se non è specificato nessuno -
getc FILEHANDLE
getc
Se si è verificato un errore o il filehandle è alla fine del file, viene restituito invece undef.
leggere la funzione
La funzione di lettura legge un blocco di informazioni dal filehandle memorizzato nel buffer: Questa funzione viene utilizzata per leggere i dati binari dal file.
read FILEHANDLE, SCALAR, LENGTH, OFFSET
read FILEHANDLE, SCALAR, LENGTH
La lunghezza dei dati letti è definita da LENGTH, e il dato viene posizionato all'inizio di SCALAR se non viene specificato alcun OFFSET. In caso contrario, i dati vengono inseriti dopo i byte OFFSET in SCALARE. La funzione restituisce il numero di byte letti in caso di successo, zero alla fine del file o undef se si è verificato un errore.
Funzione di stampa
Per tutti i diversi metodi usati per leggere le informazioni dai filehandle, la funzione principale per riscrivere le informazioni è la funzione di stampa.
print FILEHANDLE LIST
print LIST
print
La funzione print stampa il valore valutato di LIST in FILEHANDLE o nel filehandle di output corrente (STDOUT per impostazione predefinita). Ad esempio:
print "Hello World!\n";
Copia di file
Ecco l'esempio, che apre un file esistente file1.txt e lo legge riga per riga e genera un altro file di copia file2.txt.
#!/usr/bin/perl
# Open file to read
open(DATA1, "<file1.txt");
# Open new file to write
open(DATA2, ">file2.txt");
# Copy data from one file to another.
while(<DATA1>) {
print DATA2 $_;
}
close( DATA1 );
close( DATA2 );
Rinominare un file
Ecco un esempio, che mostra come possiamo rinominare un file file1.txt in file2.txt. Supponendo che il file sia disponibile nella directory / usr / test.
#!/usr/bin/perl
rename ("/usr/test/file1.txt", "/usr/test/file2.txt" );
Questa funzione renames accetta due argomenti e rinomina semplicemente il file esistente.
Eliminazione di un file esistente
Di seguito è riportato un esempio che mostra come eliminare un file file1.txt utilizzando l'estensione unlink funzione.
#!/usr/bin/perl
unlink ("/usr/test/file1.txt");
Posizionamento all'interno di un file
Puoi usare per tell funzione per conoscere la posizione corrente di un file e seek funzione per puntare una particolare posizione all'interno del file.
Tell Function
Il primo requisito è trovare la tua posizione all'interno di un file, cosa che fai usando la funzione tell -
tell FILEHANDLE
tell
Questo restituisce la posizione del puntatore del file, in byte, all'interno di FILEHANDLE se specificato, o il filehandle selezionato di default corrente se non è specificato nessuno.
cercare la funzione
La funzione seek posiziona il puntatore del file sul numero di byte specificato all'interno di un file -
seek FILEHANDLE, POSITION, WHENCE
La funzione utilizza la funzione di sistema fseek e hai la stessa capacità di posizionare in relazione a tre diversi punti: l'inizio, la fine e la posizione corrente. Puoi farlo specificando un valore per WHENCE.
Zero imposta il posizionamento relativo all'inizio del file. Ad esempio, la riga imposta il puntatore del file al 256 ° byte nel file.
seek DATA, 256, 0;
Informazioni sui file
È possibile testare alcune funzionalità molto rapidamente in Perl utilizzando una serie di operatori di test noti collettivamente come test -X. Ad esempio, per eseguire un rapido test delle varie autorizzazioni su un file, potresti utilizzare uno script come questo:
#/usr/bin/perl
my $file = "/usr/test/file1.txt";
my (@description, $size);
if (-e $file) {
push @description, 'binary' if (-B _);
push @description, 'a socket' if (-S _);
push @description, 'a text file' if (-T _);
push @description, 'a block special file' if (-b _);
push @description, 'a character special file' if (-c _);
push @description, 'a directory' if (-d _);
push @description, 'executable' if (-x _);
push @description, (($size = -s _)) ? "$size bytes" : 'empty';
print "$file is ", join(', ',@description),"\n";
}
Ecco l'elenco delle funzionalità, che puoi controllare per un file o una directory:
Sr.No. | Operatore e definizione |
---|---|
1 | -A Ora di inizio dello script meno l'ora dell'ultimo accesso al file, in giorni. |
2 | -B È un file binario? |
3 | -C Ora di inizio dello script meno l'ora dell'ultima modifica dell'inode del file, in giorni. |
3 | -M Ora di inizio dello script meno l'ora di modifica del file, in giorni. |
4 | -O Il file è di proprietà dell'ID utente reale? |
5 | -R Il file è leggibile dall'ID utente reale o dal gruppo reale? |
6 | -S Il file è un socket? |
7 | -T È un file di testo? |
8 | -W Il file è scrivibile dall'ID utente reale o dal gruppo reale? |
9 | -X Il file è eseguibile dall'ID utente reale o dal gruppo reale? |
10 | -b È un file speciale a blocchi? |
11 | -c È un file speciale di caratteri? |
12 | -d Il file è una directory? |
13 | -e Il file esiste? |
14 | -f È un file semplice? |
15 | -g Il file ha il bit setgid impostato? |
16 | -k Il file ha il bit appiccicoso impostato? |
17 | -l Il file è un collegamento simbolico? |
18 | -o Il file è di proprietà dell'ID utente effettivo? |
19 | -p Il file è una pipe con nome? |
20 | -r Il file è leggibile dall'utente effettivo o dall'ID gruppo? |
21 | -s Restituisce la dimensione del file, zero size = file vuoto. |
22 | -t Il filehandle è aperto da un TTY (terminale)? |
23 | -u Il file ha il bit setuid impostato? |
24 | -w Il file è scrivibile dall'utente o dall'ID gruppo effettivo? |
25 | -x Il file è eseguibile dall'utente effettivo o dall'ID gruppo? |
26 | -z La dimensione del file è zero? |