Как загрузить файл в хеш файл 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'
};
Спасибо.
Ответы
Ответ 1
Здесь вы идете:
my %hash;
while (<FILE>)
{
chomp;
my ($key, $val) = split /=/;
$hash{$key} .= exists $hash{$key} ? ",$val" : $val;
}
Просматривает каждую строку, разделяющую знак '=', и добавляет запись или добавляет к существующей записи в хеш-таблице.
Ответ 2
Если у вас есть контроль над файлом данных, подумайте о переходе из пользовательского формата в нечто вроде YAML. Это дает вам много возможностей из коробки без необходимости взломать ваш пользовательский формат все больше и больше. В частности, несколько ключей, создающих список, неочевидны. Способ YAML делает это намного яснее.
name: Wally Jones
department: [foo, bar]
location: [baz, biff]
Обратите внимание, что YAML позволяет вам ваять пары ключ/значение, чтобы они выстраивались в линию для удобства чтения.
И код для его анализа выполняется с помощью модуля 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'
};
Ответ 3
Можете ли вы добавить код к вашей функции карты, чтобы проверить наличие хэш-записи и добавить новое значение?
Я не делал Perl через некоторое время, но когда я делал что-то подобное в прошлом, я читал файл в строке за строкой (в то время как $inputLine = <FILE> ) и использовал split on '=' для загрузите хэш с дополнительными проверками, чтобы убедиться, что хэш уже имел этот ключ, добавив, если запись уже существует.