различные процессы построения хэшей в Perl - PullRequest
0 голосов
/ 18 декабря 2011

Я заметил, что когда-то был определен хеш-объект, как показано ниже:

 my  %data = ();
 $data{file}  = $file;
 $data{concept} = $#row;
 $data{line1} {$cell[0]} = $cell[1];

Чего пытается достичь этот процесс построения хэша? Или в чем разница между

$data{concept} = $#row;

и

$data{line1} {$cell[0]} = $cell[1];

1 Ответ

3 голосов
/ 18 декабря 2011
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

my $file = "contents of my file";
my @row = qw(some random data);
my @cell = qw(key value);

my %data = ();
$data{file}  = $file;
$data{concept} = $#row;
$data{line1} {$cell[0]} = $cell[1];

print Dumper \%data;

Выход:

$VAR1 = {
      'file' => 'contents of my file',
      'line1' => {
                   'key' => 'value'
                 },
      'concept' => '2'
};

Я думаю, $data{line1} {$cell[0]} лучше записать как $data{line1}{$cell[0]} или (мое предпочтение) $data{line1}->{$cell[0]}.

Я включил скаляр $file и массивы @row и @cell, чтобы продемонстрировать, что означает ваш код.

$data{file} = $file;

добавляет содержимое $file в ваш хэш с ключом file.

$data{concept} = $#row;

добавляет последний индекс @row к вашему хешу с ключом concept. В моем примере последний индекс равен 2, поскольку индексы в @row равны 0, 1 и 2.

$data{line1} {$cell[0]} = $cell[1];

добавляет хэш-ссылку к вашему хэшу с помощью ключа line1 (через автовификацию) и добавляет элемент $cell[1] к этому хэш-ссылке с ключом $cell[0]. Автовивификация в этом случае означает, что Perl ассоциирует line1 с хэш-ссылкой и создает его, потому что вы обращаетесь к нему с {$cell[0]}. Это избавит вас от необходимости писать:

$data{line} = {};
$data{line}{$cell[0]} = $cell[1];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...