Что говорит RobEarl правильно. Я объясню это и добавлю еще кое-что.
Ваше имя переменной %ref
и тот факт, что вы используете {}
, означает, что вы хотите получить ссылку здесь.
Давайте посмотрим, какое значение у нас будет в %ref
. Рассмотрим этот пример.
use strict; use warnings;
use Data::Printer;
my %foo = { key => 'value' };
p %foo;
Это выбросит предупреждение Reference найденного где даже размер список ожидаемого на моем Perl 5.20.2. Вывод будет:
{
HASH(0x7e33c0) undef
}
Это хэш с hashref в качестве ключа и undef
в качестве значения. HASH(0x07e33c0)
- это то, что вы получаете, когда смотрите на хеш-ссылку, не разыгрывая ее. ({}
есть, потому что Data :: Printer преобразует хэш в hashref).
Назад к вашему коду, правильная сигила для справки $
. Неважно, что это за ссылка. Ссылка всегда является скаляром (указатель на место в памяти, где хранится хэш/массив/что-то).
my $ref = {
dog => $dog,
cat => $cat,
mouse => $rat,
chicken => '', # maybe this should be undef?
};
Теперь у вас есть hashref со значениями $dog
, $cat
, $rat
и пустая строка.
Теперь вы назначаете переменную с именем $perlobj
, что означает, что это объект. Вместо этого вы назначаете скалярную переменную ($
делает ее скаляром) со списком. Если вы это сделаете, Perl присвойт только самое правое значение переменной.
my $foo = (1, 2, 3); # $foo will be 3 and there's a warning
Вы назначаете список из двух ссылок. Первый из них не учитывается и назначается только \$rethash
. Это работает, потому что удобно, $perlobj
является скаляром, а ссылки также являются скалярами. Итак, теперь $perlobj
является ссылкой %rethash
. Вот почему ваш вывод Data :: Dumper выглядит как %rethash
.
Я не уверен, что вы хотите сделать, поэтому я не могу вам помочь. Я предлагаю вам кое-что прочитать.
- perlreftut полезно узнать, как ссылки работают
- Если вы хотите сделать объектно-ориентированное программирование, проверить Moose
- Это может быть полезно, чтобы просто пойти получить книгу, чтобы узнать немного больше об основных Perl. Learning Perl по Рэндал Л. Шварц и Начиная с Perl Кертис Poe оба очень хороши для этого
вы используете '{}' при создании '% ref', когда вы должны использовать'() ' – RobEarl
Вы также хотите: 'my% perlobj = (% ref,% rethash);' – RobEarl
Возможный дубликат [Как объединить хэши в Perl?] (Http://stackoverflow.com/questions/350018/how-can-i -combine-hashes-in-perl) – RobEarl