Domanda Il modo più semplice per aprire un file di testo e leggerlo in un array con Perl


Aggiungere una funzione di apertura di file standard Perl a ogni script che ho è un po 'fastidioso:

sub openfile{
    (my $filename) = @_;
    open FILE,"$filename" or die $!;
    my @lines = <FILE>;
    return @lines;
}

e posso creare un modulo Perl per farlo, ma è così semplice che sono sicuro che ce ne dovrebbe essere già uno là fuori.

Sto cercando di trovare un modo per leggere un file di testo in un array, e non riesco a trovare un modulo Perl là fuori che possa fare questo semplice compito ... forse sto cercando troppo difficile ed è già arrivato con il installazione standard 5.10.

In via definitiva credo che assomiglierebbe a qualcosa del genere:

my @lines = Module::File::Read("c:\some\folder\structure\file.txt");

20
2018-04-17 17:28


origine


risposte:


Hai diverse opzioni, il metodo classico do:

my @array = do {
    open my $fh, "<", $filename
        or die "could not open $filename: $!";
    <$fh>;
};

Il IO :: Tutti metodo:

use IO::All;

my @array = io($filename)->slurp;

Il File :: Slurp metodo:

use File::Slurp;

my @array = read_file($filename);

E probabilmente molti di più, dopo tutto TIMTOWTDI.


27
2018-04-17 20:41



questa è la famosa "modalità slurp":

  my @lines = <FILEHANDLE> ;

potresti anche vedere Perl Slurp Ease


15
2018-04-17 17:32



Penso che questo sia quello che stai cercando

File :: Slurp


15
2018-04-17 17:32



Potresti anche prendere in considerazione l'utilizzo di Tie :: File, in particolare se stai leggendo file più grandi e non vuoi leggere l'intero file in memoria. È un modulo principale. Inoltre, si prega di fare riferimento a perlfaq5.


6
2018-04-17 18:15



Dai anche un'occhiata Perl6 :: Slurp che implementa la versione Perl6 di slurp ed è raccomandato nel libro "Perl Best Practices".

Qualche esempio....

my @lines         = slurp 'filename';
my @lines_chomped = slurp 'filename', { chomp => 1 };
my @lines_utf8    = slurp 'filename', { utf8  => 1 };

6
2018-04-17 20:28



Hai ottenuto le tecniche generali, ma voglio inserirmi in quel tipo di Perl che ti scoraggia dal farlo perché è così molto spesso accade che si possa fare la stessa cosa con una sola fila alla volta, che è intrinsecamente molto più efficiente.


4
2018-04-17 17:36



Per veloce e sporco, preferisco la semplicità del pasticcio @ARGV.

# Ysth is right, it doesn't automatically die; I need another line.
use 5.010;
use strict;
my @rows = do { 
    use warnings FATAL => 'inplace'; # oddly enough, this is the one. ??
    @ARGV='/a/file/somewhere';
    <>;
};
say q(Not gettin' here.);

Se perl * non può aprire il file, muore automaticamente.


* - l'eseguibile, quindi per favore non utilizzare maiuscole.


2
2018-04-17 18:56



Vorrei raccomandare un approccio orientato agli oggetti che non richiede moduli al di fuori della distribuzione CORE e funzionerà ovunque:

use strict;
use warnings;
use IO::File;
my $fh = IO::File->new("< $file");

foreach ($fh->getlines) {
    do_something($_);
}
$fh->close

1
2018-04-19 16:30