Perl Brasil

Pesquisar

Documentação

Artigos

Planeta

Eventos

Comunidade

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.

Discussão

(discussão)

Comentários