Abrindo corretamente um arquivo em Perl

Vamos começar com algum código, certo?

use strict;
use warnings;
use v5.14;

# Let's just pull off the first argument and use it
# as our filename
my $filename = $ARGV[0];

if ($filename) {
# Discussed more in detail below
open
(my $fh, '<', $filename) or die "$!";

# Close the file, even though it will close when the
# filehandle falls out of scope
close
($fh);
}

Três argumentos abertos

A primeira lição importante aqui é usar três argumentos abertos.

Existe uma versão do open que leva apenas dois argumentos, e o modo (<,>, | – ou – |) é concatenado com o nome do arquivo.

Isso é ruim, por razões óbvias. Digamos que temos um código parecido com este:

open(my $fh, $filename);

O que aconteceria se passássemos um arquivo chamado ‘> meuarquivo’? Nesse caso, o Perl abriria esse arquivo para escrever em vez de ler, como pretendíamos.

Verificando o resultado de open()

É muito importante verificar o resultado , pois os arquivos se recusarão a abrir por todos os tipos de razões (eles não existem, permissões, etc.). É importante relatar isso ao usuário e tomar as medidas adequadas. No meu caso, como este programa não faz nada além de abrir um arquivo, eu .open()die

Manipuladores de arquivo Lexical

Agora você deve ter visto o código que usa um glob em vez de um escalar para conter um filehandle.

open(FH, '>', $filename);

Isso é ruim, pois o filehandle não é fechado automaticamente quando o FH sai do escopo. Embora você deva fechar manualmente seus manipuladores de arquivo quando terminar de usá-los, torná-los escalares faz com que eles sejam fechados automaticamente quando saem do escopo, fornecendo uma proteção extra.

Não apenas isso, mas eles não poluem tantos namespaces quanto os tipos de vinho fazem; no entanto, esse é um assunto para outra hora.