Как загрузить файл в хэш Perl?
Вопрос
Учитывая следующий файл:
department=value1
location=valueA
location=valueB
department=value2
Я использую следующее для загрузки файла в хеш Perl:
use File::Slurp;
use Data::Dumper;
my %hash = map {
s/#.*//;
s/^\s+//;
s/\s+$//;
m/(.*?)\s*=\s*(.*)/;
} read_file($file);
print Dumper(\%hash);
Результат, однако, следующий:
$VAR1 = {
'location' => 'valueB',
'department' => 'value2'
};
Как я могу загрузить вышеуказанный файл в хеш, скажем,
$VAR1 = {
'location' => 'valueA,valueB',
'department' => 'value1,value2'
};
Спасибо.
Другие советы
Если у вас есть контроль над файлом данных, рассмотрите возможность перехода от пользовательского формата к чему-то вроде YAML.Это дает вам много возможностей без необходимости все больше и больше взламывать ваш собственный формат.В частности, неочевидно, что несколько ключей создают список.Способ YAML сделать это намного понятнее.
name: Wally Jones
department: [foo, bar]
location: [baz, biff]
Также обратите внимание, что YAML позволяет формировать пары ключ/значение так, чтобы они выстраивались в линию для облегчения чтения.
И код для его анализа выполняется модулем, ЯМЛ::XS быть лучшим из всех.
use File::Slurp;
use YAML::XS;
use Data::Dumper;
print Dumper Load scalar read_file(shift);
А структура данных выглядит так:
$VAR1 = {
'department' => [
'foo',
'bar'
],
'location' => [
'baz',
'biff'
],
'name' => 'Wally Jones'
};
Можете ли вы добавить код в свою функцию карты, чтобы проверять наличие хеш-записи и добавлять новое значение?
Я давно не работал с Perl, но когда я делал что-то подобное в прошлом, я читал файл построчно (при этом $inputLine = <FILE>) и использовал разделение по '=' для загрузки хеша с помощью дополнительные проверки, чтобы увидеть, есть ли уже в хеше этот ключ, и добавление, если запись уже существовала.