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?