Come leggere un file di testo in Perl

Il compito. C'è un file di testo. È necessario scaricare il suo contenuto in una variabile scalare in Perl programma.

Tale compito appare abbastanza spesso. Ad esempio, questo problema può verificarsi per la lettura dei file di configurazione o piccoli file di dati. Nel caso in cui trattare è grande il file, allora è meglio non utilizzare questo metodo, e utilizzare lo streaming di lettura dei file.

Una decisione. Utilizzare la libreria Path::Tiny

La cosa più semplice e conveniente soluzione è di usare Perl libreria Path::Tiny

#!/usr/bin/perl

use strict;
use warnings FATAL => 'all';
use utf8;
use open qw(:std :utf8);

use Path::Tiny;

my $file_name = 'a.txt';

my $content = path($file_name)->slurp_utf8();

print $content;

Qui path('a.txt') crea un oggetto della classe Path::Tiny, e ->slurp_utf8() chiama il metodo slurp_utf8 di questo oggetto. Il risultato in una variabile $content viene visualizzato tutto il contenuto del file.

Questa è una buona soluzione, ma è una sottigliezza. La libreria Path::Tiny non va di pari passo con il Perl, il suo bisogno di mettere separatamente. Di solito non causa problemi, ma in alcune situazioni tale decisione non è adatto.

Una decisione. Leggere il file con gli strumenti standard di Perl

Questa soluzione non è così conveniente come utilizzare la libreria Path::Tiny, deve scrivere di più, ma non richiede di installare librerie aggiuntive.

#!/usr/bin/perl

use strict;
use warnings FATAL => 'all';
use utf8;
use open qw(:std :utf8);

my $file_name = 'a.txt';

my $content = '';

open FILE, '<', $file_name or die $!;

while (<FILE>) {
    $content .= $_;
}

print $content;

Con l'aiuto di open abbiamo creato un file hendler FILE. Quando si lavora con open è importante utilizzare tre argomenti e molto importante scrivere or die, e non || die. Poi con l'aiuto di while (<FILE>) corriamo in tutto file riga per riga e mettere tutto il contenuto in una variabile $content.

Inizialmente abbiamo assegnato alla variabile $content riga vuota ''. È necessario per il codice funzionava correttamente in caso di file vuoti (se non assegnare una stringa vuota, in caso di vuoto del file in una variabile $content sarà undef).

Una decisione pericolosa. Utilizzare cat

Ecco un altro modo di come è possibile leggere il contenuto del file in una variabile. Questa soluzione non richiede librerie aggiuntive e non richiede la scrittura di molte righe di codice, ma spike la decisione. Meglio non scrivere. L'unica cosa quando lo si può fare quando il progetto non Path::Tany, va attiva del lavoro e per il controllo di altre parti del programma è necessario ottenere rapidamente il codice che legge il file. Ma in questo caso, è necessario vicino a lasciare un commento # TODO e il prima possibile rimuovere questo codice.

#!/usr/bin/perl

use strict;
use warnings FATAL => 'all';
use utf8;
use open qw(:std :utf8);

my $file_name = 'a.txt';

my $content = `cat $file_name`;

print $content;

Perché è una cattiva decisione. In primo luogo non c'è la gestione degli errori. Se il file non c'è, allora sul STDERR verrà visualizzato un avviso cat: asdf: No such file or directory, ma il programma andrà avanti. In secondo luogo questo non funziona se nel nome del file c'è la barra spaziatrice. In terzo luogo, se il contenuto di una variabile $file_name riceviamo dall'esterno c'è la possibilità che ci sarà qualcosa di simile a.txt; rm -rf / e inoltre la lettura del file saranno ancora soddisfatte azioni non sicure.

Altri articoli