Como ler um arquivo de texto em Perl

Tarefa. Tem um ficheiro de texto. Precisa baixar seu conteúdo em скалярную uma variável em um programa Perl.

Tal problema aparece com freqüência suficiente. Por exemplo, esse problema pode ocorrer para leitura de arquivos de configuração ou em pequenos arquivos de dados. No caso de se tratar de um arquivo grande, o melhor é não usar esse método, e usar streaming de leitura do arquivo.

Solução. Para usar a biblioteca de Path::Tiny

A coisa mais simples e fácil de usar solução é o uso de Perl para a biblioteca 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;

Aqui path('a.txt') cria um objeto da classe Path::Tiny, e ->slurp_utf8() chama o método slurp_utf8 este objeto. O resultado na variável $content , receberá todo o conteúdo do arquivo.

Esta é uma boa solução, mas há uma sutileza. A biblioteca Path::Tiny não vai junto com o Perl, deve-se colocar separadamente. Normalmente, isso não causa problemas, mas em algumas situações, essa solução não é adequada.

Solução. Ler o arquivo padrão de meios Perl

Esta solução não é tão conveniente como o uso de uma biblioteca de Path::Tiny, tem que escrever mais, mas ela não exige a instalação de bibliotecas adicionais.

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

Com a ajuda de open nós criamos o arquivo хендлер FILE. Quando se trabalha com open é importante usar três argumentos e é muito importante escrever or die, e não || die. Mais com a ajuda de while (<FILE>) corremos em todo o arquivo linha por linha e recolhemos todo o conteúdo em uma variável de $content.

Inicialmente, nós atribuiu a variável $content linha em branco ''. É necessário para que o código funcione correctamente em caso de arquivos vazios (se você não atribuir uma linha em branco, no caso de um arquivo vazio na variável $content será undef).

Perigosa solução. Usar cat

Aqui está outra maneira de como você pode ler o conteúdo do arquivo em uma variável. Esta solução não requer extra dlls e não necessita de escrever muitas linhas de código, mas é костыльное solução. A melhor forma de não escrever nunca. A única coisa aconteceu que você pode fazer é quando o projeto não Path::Tany, vai activa de emprego e para a verificação de outras partes do programa deve obter rapidamente o código que lê um arquivo. Mas neste caso você precisa perto de deixar um comentário # TODO e na primeira oportunidade de limpar o código.

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

Por que é uma má decisão. Em primeiro lugar, não há um tratamento de erros. Se o arquivo não existir, o STDERR será exibido um aviso cat: asdf: No such file or directory, mas o programa vai ir mais longe. Em segundo lugar, isso não funciona se o nome do arquivo de um espaço. Em terceiro lugar, se o conteúdo da variável $file_name recebemos de fora, então há uma chance de que haverá algo como a.txt; rm -rf / e além de ler de um arquivo serão ainda realizadas inseguros passos.

Outros artigos