r1 - 09 Mar 2006 - IgorSutton
Como processar um arquivo com conteúdo do tipo "chave: valor"
Problema
Precisamos processar um arquivo com este conteúdo:nome: Fulano de Tal email: tal.fulano@empresa.com url: http://www.empresa.com nome: Beltrano de Outrem email: outrem.beltrano@outraempresa.com.br url: http://www.outraempresa.com.br
Solução
Você pode utilizar uma estrutura de hashes para fazê-lo, desta maneira:
#!/bin/env perl
use Data::Dumper;
my @dados = ();
# Mudamos o separador de registros para uma linha em branco
$/ = "\n\n";
# Iteramos os registros
foreach (<DATA>) {
my %registro = ();
# Dividimos o registro por linha
my @linhas = split/\n/;
# Iteramos as linhas
foreach my $linha (@linhas) {
chomp($linha);
# Separamos a chave e o valor, e atribuimos à %registro
my ($chave, $valor) = split/: /, $linha;
$registro{$chave} = $valor;
}
# Armazenamos a referência do registro no array @dados
push @dados, \%registro;
}
print Dumper \%dados;
__DATA__
nome: Fulano de Tal
email: tal.fulano@empresa.com.br
url: http://www.empresa.com.br
nome: Beltrano de Outrem
email: outrem.beltrano@outraempresa.com.br
url: http://www.outraempresa.com.br
Uma solução mais Perlish seria:
#!/bin/env perl
use Data::Dumper;
my %dados = ();
$/ = "\n\n";
foreach (<DATA>) {
# Popula-se o hash %registro a partir do comando split, que
# separa o registro atual nos separadores '\s+' e '\n'
my %registro = split /:\s+|\n/;
$dados{$registro{'nome'}} = \%registro;
}
print Dumper \%dados;
__DATA__
nome: Fulano de Tal
email: tal.fulano@empresa.com.br
url: http://www.empresa.com.br
nome: Beltrano de Outrem
email: outrem.beltrano@outraempresa.com.br
url: http://www.outraempresa.com.br
Devemos sempre nos lembrar que um hash é um array de número par, onde o item de índice par se refere ao item de índice ímpar. Veja Perldoc.Perldata para maiores informações.
