Чтение содержимого файла в perl-хэш с помощью map - PullRequest
1 голос
/ 29 сентября 2019

Я пытаюсь прочитать содержимое файла в строку просмотра содержимого хеш-файла,

A|A1
B|B1
C|C1

код, который у меня есть,

use strict;
use warnings;
use Data::Dumper;

my $instAttribFileName="DATABYIDENTIFIER_InstCommonAttrList.config";

open(IFH,$instAttribFileName) or die "cannot open file";
my %attribhash = ();
%attribhash = map {chomp; split /\|/} (<IFH>);
print Dumper %attribhash;

Dumper не печатает хешно читает A, A1 и т. д. в отдельные переменные.

что я здесь не так делаю?

Ответы [ 2 ]

7 голосов
/ 29 сентября 2019

Согласно perldoc perldata :

Списки выполняют автоматическую интерполяцию подсписков. То есть, когда оценивается LIST, каждый элемент списка оценивается в контексте списка, и результирующее значение списка интерполируется в LIST так же, как если бы каждый отдельный элемент был членом LIST. Таким образом, массивы и хэши теряют свою идентичность в LIST

. Поэтому вам нужно передать хеш по ссылке на Dumper(), иначе он будет сведен в список отдельных аргументов. ,Например, если у вас есть:

my %foo = ( a => 'A', b => 'B');
print Dumper %foo;

Вывод :

$VAR1 = 'b';
$VAR2 = 'B';
$VAR3 = 'a';
$VAR4 = 'A';

, но если вместо этого вы передаете ссылку на %foo (путем добавления обратной косой черты вспереди):

print Dumper \%foo;

получаем:

$VAR1 = {
          'b' => 'B',
          'a' => 'A'
        };

Рекомендации:

2 голосов
/ 30 сентября 2019

Всегда стоит прочитать всю документацию по модулям, которые вы пытаетесь использовать. Раздел «ОШИБКИ» в руководстве Data :: Dumper гласит:

Из-за ограничений семантики вызова подпрограммы Perl вы не можете передать массив или хеш. Добавьте перед ним \ для передачи ссылки.

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