Tutor NumaBoaLEITURA E ESCRITA DE ARQUIVOS
Tutorial Linguagem Perl - 11
Silício NumaBoa

Roteiro do Módulo:
Leitura e Escrita de Arquivos
Abrir e Fechar Arquivos
Leitura de Arquivos
Escrever Dados em Arquivos


Abrir e Fechar Arquivos

Com scripts Perl é possível administrar arquivos. Associados a scripts CGI, pode-se ler e escrever arquivos no servidor. As aplicações mais conhecidas de CGI, como contadores de acesso ou livros de visita, utilizam-se dessa possibilidade.

Cada arquivo que deva ser lido, ou que deva receber dados (ser escrito) através de um script Perl, precisa antes ser aberto. Após a leitura ou a escrita, os arquivos deveriam ser fechados novamente. Exemplos:

#!/usr/bin/perl

open(ARQUIVONOTICIA, "<news.txt"); # Abrir arquivo para leitura
close(ARQUIVONOTICIA);

open(ARQUIVONOTICIA, ">news.txt"); # Abrir arquivo para escrita
close(ARQUIVONOTICIA);

open(ARQUIVONOTICIA, ">>news.txt"); # Abrir arquivo para escrita complementar
close(ARQUIVONOTICIA);

if(open(ARQCONTA, "<counter/counter.dat") == false)
{ print "Arquivo Contador não encontrado\n"; }

open(ARQCONTA, "<counter/counter.dat") || die "Arquivo Contador não encontrado\n";

Abre-se um arquivo com a função Perl open. Esta função requer dois parâmetros.

O primeiro parâmetro é um manipulador (handler) de arquivo. O handler é um nome que o arquivo aberto recebe e que serve para referenciá-lo (não é o nome próprio do arquivo, é uma espécie de apelido). Este nome é de livre escolha. Costuma-se usar apenas letras maiúsculas para nomes de handlers. Nos exemplos acima, os referidos nomes são ARQUIVONOTICIA e ARQCONTA.

O segundo parâmetro exigido é o nome do arquivo que deve ser aberto. Se o arquivo em questão estiver num diretório diferente do do script, há a necessidade de se indicá-lo.

Antes do nome do arquivo (ou do diretório/nome do arquivo) indica-se, através de caracteres especiais, qual o modo de abertura que deve ser utilizado:

<arquivo.dat significa: abrir arquivo.dat somente para leitura. Um erro é gerado caso o arquivo não exista.

>arquivo.dat significa: abrir arquivo.dat para escrita. Se o arquivo já existir, seu conteúdo é substituído pelo novo. Caso não exista, um novo arquivo é criado.

>>arquivo.dat significa: abrir arquivo.dat para escrita. Se o arquivo já existir, o novo conteúdo é adicionado, isto é, o conteúdo antigo não é eliminado. Caso não exista, um novo arquivo é criado.

+>arquivo.dat significa: abrir arquivo.dat para leitura e escrita.

|procura.exe significa: o arquivo procura.exe é um programa executável. O programa é aberto para poder ser executado.

Faz parte de uma boa programação rastrear possíveis erros na abertura de arquivos e tratá-los no script Perl. Os dois últimos exemplos mostram construções de diretivas para reagirem a esses possíveis erros. O penúltimo exemplo trabalha com uma diretiva condicional e mostra uma mensagem de erro, com a ajuda da função print, caso ele ocorra. O último exemplo faz uso de uma simples expressão OU que o interpretador Perl avalia. Inicialmente é avaliada a primeira parte da expressão (na frente do operador lógico ||). Este é o comando para abrir o arquivo. Se o arquivo for aberto com sucesso, a função open devolve o valor "verdadeiro" tornando toda a expressão lógica como verdadeira. Se o arquivo não puder ser aberto, então a segunda parte da expressão é avaliada. Neste caso, através da função die (die = morrer), o texto indicado é mostrado e o script é interrompido. O texto da função die é opcional.



Leitura de Arquivos

Existem diversas possibilidades de leitura de arquivos. O tipo de leitura depende das tarefas que o script Perl deve executar. A premissa para a leitura de arquivos é que os arquivos estejam abertos para leitura. Exemplo 1 (Leitura de arquivo linha por linha):

#!/usr/bin/perl

@Linhas = ("");
open(DADOSMAIL, "<inbox.dat") || die "Arquivo com E-Mails não encontrado\n";
while(<DADOSMAIL>) {
   push(@Linhas,$_);
}
close(DADOSMAIL);

for(@Linhas) {
   if(/HTML/) {
      print $_;
   }
}

Exemplo 2 (Leitura de arquivo caracter por caracter):

#!/usr/bin/perl

@Vogais = ("a","e","i","o","u");
@Frequencia = (0,0,0,0,0);

open(DADOS, "<$ARGV[0]") || die "$_[1] não encontrado\n";
while(($CaracterAtual = getc(DADOS)) ne "") {
   for($i=0;$i<=4;++$i) {
      if($CaracterAtual eq $Vogais[$i]) {
         $Frequencia[$i]++;
      }
   }
}

close(DADOS);
for($i=0;$i<=4;++$i) {
   print "$Vogais[$i] aparece $Frequencia[$i] vezes em $ARGV[0]\n";
}

O modo habitual de leitura de arquivos em Perl é a leitura linha por linha, como no exemplo 1 mostrado acima. Isto funciona com todos os arquivos que possam ser lidos com facilidade por um editor de texto portanto, todo tipo de arquivo de texto, arquivos de configuração ou arquivos de dados estruturados em linhas e com delimitadores para os campos. Para este tipo de leitura nem existe um comando especial em Perl. Utiliza-se apenas um laço while com a sintaxe while(<HANDLERDOARQUIVO>) onde HANDLERDOARQUIVO é o nome atribuído na ocasião do open. No interior do laço pode-se obter a linha atual através de variável predefinida $_. Para manter os dados na memória, visando um processamento posterior, é possível armazenar as linhas numa lista (como no exemplo 1)

.

Arquivos binários, ou seja, arquivos com formatos de programas específicos e que contenham valores numéricos e caracteres especiais, adaptam-se melhor a uma leitura caracter por caracter (como no exemplo 2). A função de leitura de caracteres de um arquivo é a getc. Esta função devolve o último caracter lido, o qual pode ser armazenado numa variável. Quando se atinge o final do arquivo, esta função devolve um caracter vazio (hexadecimal 0). É por esse motivo que, no exemplo 2, se utiliza o operador relacional ne "" como condição para terminar a alça while.

Observações: O exemplo 2 mostra também como se pode ler um arquivo cujo nome é enviado através de um parâmetro. Os argumentos repassados ao script ficam armazenados na variável predefinida @ARGV.



Escrever dados em arquivos

Dependendo do modo como um arquivo foi aberto (veja modos de abertura), um arquivo pode ser sobre-escrito ou ter novos dados adicionados. Exemplo:

#!/usr/bin/perl
# Este exemplo faz a leitura de endereços que têm vírgulas como caracteres
# delimitadores e os escreve em formato HTML num novo arquivo

@Endereco = (""); # Armazena todos os registros
@Registro = (""); # Armazena todos os campos do registro atual
$Campos = ""; # Armazena os nomes dos campos (estão no primeiro registro
$i = 0;
open(ENDERECOS, "<enderecos.csv") || die "Arquivo de endereços não encontrado\n";
while(<ENDERECOS>) # Leitura do arquivo delimitado por vírgulas
{
   if($i == 0) # Ler primeira linha do arquivo {
      $Campos = $_; # Pegar nome dos campos
   }
   else
   {
      $Endereco[$i] = $_; # a partir da segunda linha por em @Endereco
   }
   $i++; # Incrementar contador
}
close(ENDERECOS);
$Numero = $i - 1; # Guardar número de registros
chop($Campos);
@DadosCampos = split(/,/,$Campos); # Separar o nome dos campos

open(DADOSEND, ">enderecos.htm"); # Abrir arquivo HTML para escrita
print DADOSEND "<html>\n<head>\n"; # Escrita no arquivo HTML
print DADOSEND "<title>Endereços</title>\n";
print DADOSEND "</headn\n<body bgcolor=#FFFFFF\n";
for(@Endereco) # Enquanto houver dados na lista
{
   @Registro = split(/,/,$_); # Abrir registro atual
   $i = 0;
   for(@Registro) {
      # Escrever registro atual
      print DADOSEND "<b>$DadosCampos[$i]:</b> $Registro[$i]<br>\n";
      $i++;
   }
}
print DADOSEND "</body>\n</html>\n";
close(DADOSEND);
print $Numero," Registros escritos\n"; # Apenas para controle: na saída padrão

Esclarecimentos: Para escrever dados em arquivos, utiliza-se normalmente a função print da Perl. Ao contrário das saídas através da saída padrão, a escrita num arquivo precisa referenciar o handler atribuído na abertura do mesmo após o comando print. No exemplo acima, o arquivo enderecos.htm é aberto para escrita e recebe o handler DADOSEND. Com print DADOSEND "dados..." é praticada a escrita dos dados no referido arquivo.


Todos os scripts CGI deste site são "made in Aldeia". As linguagens utilizadas são principalmente PHP e alguma coisa em Perl. Faça contato: tire dúvidas, solicite matérias, critique e contribua.




@ Linguagem Perl | Generalidades | Fundamentos | Variáveis | Predefinidas | Condicionais | Loops/Saltos | Operadores | Regulares | Sinais | Funções | Arquivos | Strings | Números | CGI | Scripts |

| AAAA | Página Inicial | Mapa do Site | Novidades | Busca | Indique esta página | Mestre da Teia | Voltar |
| Localizador || @ Info NumaBoa > Tutoriais > Linguagem Perl - Leitura e escrita de arquivos
Créditos: vovó Vicki

webdesign sobMedida by vickiSoft - /informatica/tutor/linguagens/perlArquivos.php (23.08.00) versão 1.1 de 29.07.03
Licença Creative Commons 1998-2006 Aldeia NumaBoa
Exceto onde especificamente declarado, todo material deste site é disponibilizado de acordo com a Licença Creative Commons.