Учитывая следующий файл:
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'
};
Спасибо.





Ну вот:
my %hash;
while (<FILE>)
{
chomp;
my ($key, $val) = split /=/;
$hash{$key} .= exists $hash{$key} ? ",$val" : $val;
}
Это проходит через каждую строку, разделенную знаком '=', и либо добавляет запись, либо добавляет к существующей записи в хеш-таблице.
Когда я тестирую Windows с Perl 5.12.1, значениям всегда предшествует запятая .... Мне нужно заменить последний оператор на полное условное if.
Можете ли вы добавить код в свою функцию карты, чтобы проверить наличие хеш-записи и добавить новое значение?
Я давно не работал с Perl, но когда я делал что-то подобное в прошлом, я читал файл построчно (в то время как $ inputLine = <FILE>) и использовал разделение на '=' для загрузки хэша с дополнительные проверки, чтобы увидеть, был ли у хэша этот ключ, добавляя, существует ли уже запись.
Если у вас есть контроль над файлом данных, подумайте о переключении с пользовательского формата на что-то вроде 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'
};
строка print Dumper Загрузить скаляр read_file (shift); выглядит подозрительно. Отсутствует двойная двоеточие?
@gorn Это правильно. Dumper() из Data :: Dumper, Load() из YAML :: XS, scalar является встроенным, а read_file() из File :: Slurp. С пареной это похоже на print(Dumper(Load(scalar(read_file(shift))))), поэтому я отказался от пареной.
Спасибо. Только что вставлен chomp ($ val). Работает как шарм. :)