Hvordan til at læse en tekst-fil i Perl

Opgave. Der er en tekst fil. Du er nødt til at hente indholdet i en skalar variabel i et Perl-program.

Et sådant problem forekommer ganske ofte. For eksempel, at et sådant problem kan opstå læsning konfiguration filer eller små data filer. Hvis du har brug for at behandle en stor fil, er det bedre ikke at bruge denne metode, og at bruge en stream læse fra en fil.

Løsningen. For at bruge et bibliotek Sti::Tiny

Den enkleste og mest praktiske løsning er at bruge Perl-bibliotek Sti::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;

Her path('a.txt') opretter et objekt af klassen Sti::Tiny, og ->slurp_utf8() kalder metoden slurp_utf8 dette objekt. Det resultere i en variabel $content Popper alle indholdet af filen.

Dette er en god løsning, men der er en underfundighed. Bibliotek Sti::Tiny er ikke med Perl, det skal føres separat. Normalt er dette ikke giver problemer, men i nogle situationer kan denne løsning er ikke egnet.

Løsningen. For at læse filen med standard værktøjer Perl

Denne løsning er ikke så praktisk som at bruge biblioteket Sti::Tiny, jeg har mere at skrive, men det kræver ikke installation af yderligere biblioteker.

#!/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;

Hjælp open , vi har skabt en fil handler FILE. Når du arbejder med open det er vigtigt at bruge de tre argumenter, og det er meget vigtigt at skrive or die, ikke || die. Så med hjælp while (<FILE>) vi kører rundt i den fil linje for linje og indsamle alle indholdet i en variabel $content.

I første omgang har vi tildelt en variabel $content tom linje ''. Dette er nødvendigt for at gøre koden fungerer korrekt i tilfælde af tom fil (hvis du ikke tildele en tom streng, i tilfælde af en tom fil i en variabel $content vil undef).

En meget farlig beslutning. Brug cat

Her er en anden måde, hvordan du kan læse filens indhold ind i en variabel. Denne løsning ikke kræver nogen yderligere biblioteker og kræver ikke at skrive mange linjer kode, men dette er en stigning løsning. Det er bedst aldrig at skrive. Den eneste måde at gøre dette på er, når projektet ikke har Path::Tany, arbejder aktivt og til at kontrollere andre dele af programmet har brug for nogle hurtige kode, der læser filen. Men i dette tilfælde, du har brug for næste efterlad en kommentar # TODO og ved den første mulighed for at fjerne denne kode.

#!/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;

Hvorfor er det en dårlig beslutning. Først er der ingen fejlhåndtering. Hvis filen ikke er det, så STDERR vil modtage en advarsel cat: asdf: No such file or directory, men programmet vil gå videre. For det andet, det vil ikke fungere, hvis filnavnet har en plads. For det tredje, hvis indholdet af variablen $file_name , vi får, uden der er en chance for, at der vil være noget som a.txt; rm -rf / , og ud over at kunne læse filen vil stadig blive udført usikre handlinger.

Andre artikler