Back-End

7 jun, 2010

Leitura e escrita de arquivos com Perl

Publicidade

Uma operação comum e que possui diversas aplicações computacionais é a leitura e escrita de informações em arquivo, pois desta forma o dado poderá ser recuperado posteriormente. Em sistemas os dados geralmente não são armazenados em arquivos, pois o volume é muito grande e com isso diversos problemas vem juntos, como questões de segurança, desempenho e busca de informações, mas por outro lado, o armazenamento
de variáveis de configuração, que podem ser alteradas com frequência podem ser colocadas separadas num arquivo para facilitar o processo.

E esse é o pano de fundo deste artigo de hoje, como ler e escrever dados em arquivos tendo como objetivo que esse arquivo seja de configuração e utilizado por uma aplicação, tornando esse exemplo ainda mais útil. Em geral, um arquivo de configuração tem o seguinte formato:

# dados do servidor
#
NOME_SERVIDOR=localhost
PORTA_SERVIODR=8181

# informacoes da aplicacao
#
NOME_SERVICO=teste

USUARIO=marcelo

O formato deste arquivo segue o padrão chave/valor, onde o termo à esquerda é uma chave que identifica unicamente um valor que venha à direita, ambos separados pelo símbolo de igual, como que “atribuindo” um valor a uma variável. Dependendo dos arquivos de configuração, permite-se incluir comentários nele, sendo que no exemplo, o comentário é definido nas linhas que tiverem o símbolo # (sustenido), desconsiderando para
fins de processamento tudo que vier depois dele. Eis o código que implementa este requisito:

open(ARQ, "< arq.properties");

while (<ARQ>) {
  chomp;
  print "$_ \n" if ($_ !~ /^#/);
}
close(ARQ);

A função open abre o arquivo indicado no segundo argumento. Este arquivo será aberto para leitura, sendo isso identificado pelo símbolo “<” seguido pelo nome do arquivo que será aberto. Junto a isso, será criada uma referência para o arquivo aberto no identificador ARQ. Esse nome poderia ser qualquer termo que seria posteriormente usado.

Como deseja-se operar sobre todas as linhas, a repetição deverá ocorrer enquanto não se chegar ao final do arquivo. Como a cada iteração é retornada a linha corrente e passada para a seguinte, depois de processada a última a repetição termina. Essa “linha corrente retornada” fica armazenada na variável padrão
INSERT:CONTENT:END , sendo acessada dentro do corpo da repetição. A chamada da função chomp remove quaisquer “\n” que existam e em seguida, o processamento propriamente dito é feito.

Neste exemplo, é apenas impresso na tela linhas que não comecem com o símbolo “#”, mas algo mais útil poderia ser feito, como o armazenamento dos dados em memória para posterior uso e manipulação por outros pontos do sistema. Finalizada a repetição, fecha-se a referência para o arquivo, impedindo que eventuais alterações não sejam perdidas.

A operação simétrica à leitura de dados de um arquivo é a escritas de dados num arquivo. Um exemplo prático desta situação é escrever o resultado de uma consulta ou processamento em arquivos CSV (comma-separated values), que podem ser transportados entre diferentes aplicações ou mesmo abertos dentro de planilhas de processamento que geram gráficos. Em exemplos:

@dados = ('Marcelo', 'teste', '123');

open(ARQ, "> saida.csv");

print ARQ join(",", @dados);

close ARQ;

Foi definido um vetor com dados básicos para serem utilizados como teste. Neste vetor existem três elementos, que irão compor uma linha do resultado. Em seguida, abre-se o arquivo onde os dados serão escritos, também usando a função open, só que agora com o símbolo “>”, indicando que o sentido dos dados serão escritos “para o arquivo”.

Para colocar a informação efetivamente no arquivo, usa-se a já tradicional função print, só que agora, o destino da escrito é modificado. Ao invés de escrever na saída padrão, normalmente o monitor, escreve-se no lugar referenciado por ARQ, que a referência para o arquivo. Em seguida, coloca-se qual o conteúdo a ser escrito, no caso, o conteúdo da variável @dados, concatenado com o vírgula. Repare que não existe qualquer separador além de um espaço entre a palavra ARQ e a função join.

Por fim, depois de realizado o processamento, deve-se fechar o arquivo para que as alterações sejam salvas. Esse tipo de operação normalmente vem dentro de uma repeitção, pois o resultado da consulta tende a possuir diversas linhas.

Espero que esses exemplos sejam úteis. Comentários são sempre bem-vindos.