Как загрузить файл в хеш Perl? - PullRequest
11 голосов
/ 25 октября 2008

Учитывая следующий файл:

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 ]

22 голосов
/ 25 октября 2008

Вот, пожалуйста:

my %hash;
while (<FILE>)
{
   chomp;
   my ($key, $val) = split /=/;
   $hash{$key} .= exists $hash{$key} ? ",$val" : $val;
}

Он проходит через каждую строку, разделяющуюся на знак '=', и либо добавляет запись, либо добавляет к существующей записи в хеш-таблице.

5 голосов
/ 26 октября 2008

Если у вас есть контроль над файлом данных, подумайте о переключении с пользовательского формата на что-то вроде 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'
        };
0 голосов
/ 25 октября 2008

Можете ли вы добавить некоторый код в функцию карты, чтобы проверить наличие хеш-записи и добавить новое значение?

Я давно не делал Perl, но когда я делал что-то подобное в прошлом, я читал файл построчно (пока $ inputLine = ) и использовал split для '=', чтобы загрузить хеш с дополнительными проверками, чтобы видеть, имел ли хеш уже этот ключ, добавляя, если запись уже существовала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...