Pergunta

Dado o seguinte arquivo:

department=value1
location=valueA
location=valueB
department=value2

Eu uso o seguinte para carregar o arquivo em um hash Perl:

use File::Slurp;
use Data::Dumper;
my %hash = map {
   s/#.*//;
   s/^\s+//;
   s/\s+$//;
   m/(.*?)\s*=\s*(.*)/;
} read_file($file);
print Dumper(\%hash);

O resultado, porém, é o seguinte:

$VAR1 = {
          'location' => 'valueB',
          'department' => 'value2'
        };

Como posso carregar o arquivo acima em um hash com, digamos,

$VAR1 = {
          'location' => 'valueA,valueB',
          'department' => 'value1,value2'
        };

Graças.

Foi útil?

Solução

Aqui vai:

my %hash;
while (<FILE>)
{
   chomp;
   my ($key, $val) = split /=/;
   $hash{$key} .= exists $hash{$key} ? ",$val" : $val;
}

Esta anda através de cada divisão linha no sinal '=' e quer adiciona uma entrada ou acrescenta a uma entrada existente na tabela de hash.

Outras dicas

Se você tem controle sobre o arquivo de dados, considere mudar de um formato personalizado para algo como YAML. Isso lhe dá uma grande quantidade de energia fora da caixa sem ter que cortar o seu formato personalizado cada vez mais. Em particular, várias chaves criando uma lista não é óbvio. maneira de fazer isso do YAML é muito mais clara.

name:       Wally Jones
department: [foo, bar]
location:   [baz, biff]

Note também que YAML permite esculpir os pares de chave / valor para que eles se alinham para facilitar a leitura.

E o código para analisar é feito por um módulo, YAML :: XS sendo o melhor do grupo.

use File::Slurp;
use YAML::XS;
use Data::Dumper;

print Dumper Load scalar read_file(shift);

e os olhares de estrutura de dados da seguinte forma:

$VAR1 = {
          'department' => [
                            'foo',
                            'bar'
                          ],
          'location' => [
                          'baz',
                          'biff'
                        ],
          'name' => 'Wally Jones'
        };

Você pode adicionar algum código para a sua função de mapa para verificar a existência de uma entrada de hash e acrescentar o novo valor?

Eu não fiz Perl em um tempo, mas quando eu fiz algo parecido com isso no passado, eu li o arquivo em linha por linha (enquanto $ inputLine = ) e repartidas utilizadas em '=' para carga o hash com verificações adicionais para ver se o hash já tinha essa chave, anexando se a entrada já existe.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top