использование неинициализированных хэшей в Perl - PullRequest
0 голосов
/ 17 марта 2011

У меня есть 3 глобальных хэша, определенных в perl как

my %a = (); 
my %b = ();
my %c = ();

Теперь появляется следующий код: -

if(checkSomeCondition) {  
    %c = %a;  
}  
else {  
    %c = %b;  
}
do some operations on %c

, но проблема в том, что% a и% b все еще не инициализированы,% c принимает неопределенное значение% a и% b.так что та операция, которую я сейчас выполняю на% c, не переключается на действительный% a или% b.
, то есть, если я назначу% c для% a, позже я снова вернусь к условию if и назначу теперь% b, вернитесь снова, чтобы назначить% a, на этот раз% a не имеет допустимого значения для отображения действительных операций, выполненных ранее.

Как обойти эту проблему?

Ответы [ 3 ]

3 голосов
/ 17 марта 2011

Если я понимаю ваш вопрос, то вы ищете ссылки:

my (%a, %b, $c);  # $c is a scalar to hold the hash reference

if (condition) {
    $c = \%a;   # the `\` operator takes a reference to the variable
} else {
    $c = \%b;
}

# do stuff with %$c

Итак, предположив, что condition было правдой:

$$c{new_key} = 'value';  # or `$c->{new_key} = 'value';`

print "$_: $a{$_}\n" for keys %a;  # prints "new_key: value"

Вы можете узнать больше о ссылках Perlна странице руководства perlref .

Наконец, я надеюсь, что имена переменных, которые вы используете, просто для этого примера.Длинные имена переменных помогают документировать ваш код.

1 голос
/ 17 марта 2011

Хэши не имеют "инициализированного" или "неинициализированного" состояния. Они либо пусты, либо содержат содержимое.

Действительно неясно, с чем у вас проблемы; Вы хотите, чтобы изменения в% c вступили в силу в% a или% b в зависимости от вашего состояния? Если это так, вы должны использовать ссылку на хеш.

0 голосов
/ 17 марта 2011

Поведение ожидается.

Когда вы выполняете операцию:% c =% a, хеш% c перезаписывается содержимым% a, в основном копируется из% a в% c. Таким образом, если% a пусто / не определено,% c будет неопределенным после вышеуказанной операции (даже если у% c было некоторое содержимое до операции, теперь оно будет пустым).

Как упомянуто 'runrig', вам, вероятно, следует добавить дополнительные проверки перед копированием по хэшам.

Если вы можете предоставить более подробную информацию о том, чего именно вы пытаетесь достичь, возможно, может помочь.

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