[SP-pm] Array? Hashes? Outros?

Eden Cardim eden at insoli.de
Tue Mar 12 03:42:33 PDT 2013


>>>>> "Marcio" == Marcio  <- Google <marciorp-Re5JQEeQqe8AvxtiuMwx3w em public.gmane.org>> writes:

    Marcio> Mestres, Tenho um script que quado inicializa começa
    Marcio> acumular algumas informações, e quando é finalizado essas
    Marcio> informações são descartadas. É pouco coisa. Preciso de
    Marcio> algo como uma tabela temporária, os dados só existem
    Marcio> durante a execução do script. To usando por enquanto
    Marcio> hashes, mais tá ficando confuso. Pensando em uma tabela em
    Marcio> um banco de dados (o que é inviável)

Porque é inviável?

    Marcio> ela teria 7 colunas, sendo uma delas a chave e pela qual
    Marcio> preciso localizar os registros, e não teria mais que 20
    Marcio> registros.

A forma típica de implementar isso é fazer exatamente o que um banco
de dados faria. Você precisa de duas estruturas, uma tabela e um
índice dessa tabela.

my @usuarios = (
  { nome => 'foo', email => 'foo em foo.com' },
  { nome => 'bar', email => 'bar em bar.com' },
  ...
);

my %indice_nome;

for my $registro (@usuario) {
  $indice_nome{$registro->{nome}} = $registro;
}

Depois você vai poder acessar os registros usando o índice:

my $registro = $indice_nome{foo};

Tem alguns problemas que você vai precisar resolver manualmente. Você
vai precisar atualizar o índice manualmente depois de qualquer
operação de escrita. E você também vai precisar garantir a unicidade
da chave. Sem essa verificação, se houverem registros com chaves
duplicadas, você vai perder dados.

    Marcio> Quando o script inicia, a tabela não teria nenhum valor,
    Marcio> apenas a "estrutura", durante a execução serão incluídos,
    Marcio> excluídos e alterados registros. Quando o script termina
    Marcio> os dados são descartados.

    Marcio> Qual a maneira mais prática e elegante de fazer isso?

A maneira que eu vejo como mais prática é usar um banco de dados
mesmo. Você pode usar SQLite in-memory, assim:

my $dbh = DBI->connect('dbi:SQLite:dbname=:memory:');

Se não puder instalar módulos, tem o DB_File que vem no core:

http://perldoc.perl.org/DB_File.html#SYNOPSIS

-- 
Eden Cardim -- Insolide Soluções de TI Ltda.
+55 11 9644 8225
http://insoli.de


More information about the SaoPaulo-pm mailing list