Как выскочить из массива внутри хеш-рефа? - PullRequest
0 голосов
/ 29 августа 2011

Мозг становится туманным на этом.Я хотел перевести мою игру в кости от использования rand () до использования списка случайных значений из random.org.Я смог получить значения очень хорошо, я просто завис на синтаксис, чтобы выскочить из списка.

Вот моя функция, которая дает мне посадки:

sub roll_d
{
  return (pop($$dice_stack{@_[0]}));
  # Original code:
  #return (int(rand @_[0]) + 1);
}

Где $dice_stack - указатель на хеш, где ключом является тип кости («6» для d6, «20» для d20), а значение представляет собой массив целых чисел от 1 до типа кости.

Ответы [ 2 ]

7 голосов
/ 29 августа 2011

$$dice_stack{@_[0]} - иначе $dice_stack->{@_[0]} - это ЗНАЧЕНИЕ в хэш-функции. Таким образом, это обязательно будет скаляр и не может быть poppable-from-array.

Если значение является ссылкой на массив , необходимо отменить ссылку:

  return ( pop(@{ $dice_stack->{ @_[0] } }) );

Если это НЕ массив, вам нужно получить к нему доступ другим способом.

Кроме того, это начинает выглядеть по-гольфистски - на этом этапе шумности линии я бы рекомендовал перейти на более читаемый код (ИМХО):

  my ($dice_type) = @_;
  my $dice_list = $dice_stack->{$dice_type};
  return pop(@$dice_list);
1 голос
/ 29 августа 2011

Попробуйте сначала разыменовать массив:

pop(@{$dice_stack{@_[0]}})
...