Как загрузить файл в хэш 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'
        };
спасибо.
3 ответов
здесь вы идете:
my %hash;
while (<FILE>)
{
   chomp;
   my ($key, $val) = split /=/;
   $hash{$key} .= exists $hash{$key} ? ",$val" : $val;
}
это проходит через каждое разделение строк на знаке " = " и либо добавляет запись, либо добавляет к существующей записи в хэш-таблице.
Если у вас есть контроль над файлом данных, подумайте о переключении с пользовательского формата на что-то вроде 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'
        };
можете ли вы добавить код в свою функцию Карты, чтобы проверить наличие хэш-записи и добавить новое значение?
Я не делал Perl некоторое время, но когда я делал что-то подобное в прошлом, я читал файл в строке за строкой (в то время как $inputLine = 
