Como faço para carregar um arquivo em um hash Perl?
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.
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 =