Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何从hashref中的数组中弹出?_Arrays_Perl_Random_Hash_Hashref - Fatal编程技术网

Arrays 如何从hashref中的数组中弹出?

Arrays 如何从hashref中的数组中弹出?,arrays,perl,random,hash,hashref,Arrays,Perl,Random,Hash,Hashref,大脑在这件事上变得模糊了。我想让我的骰子游戏从使用rand()变成使用random.org上的随机值列表。我能够很好地检索这些值,只是挂断了从列表中弹出的语法 这是我的功能,让我适合: sub roll_d { return (pop($$dice_stack{@_[0]})); # Original code: #return (int(rand @_[0]) + 1); } 其中$dice_stack是指向散列的指针,其中键是骰子类型(“6”表示d6,“20”表示d20),值是

大脑在这件事上变得模糊了。我想让我的骰子游戏从使用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和骰子类型之间的整数数组。

请先尝试取消对数组的引用:

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

$$dice\u stack{@u0]}
-aka
$dice\u stack->{@u0]}
-是hashref中的值。因此,它必须是一个标量,不能是一个可从数组中弹出的

如果该值是数组引用,则需要取消引用:

  return ( pop(@{ $dice_stack->{ @_[0] } }) );
如果它不是arrayref,则需要以其他方式访问它

另外,这开始看起来像是golfish——在这一点上,我建议切换到更具可读性的代码(IMHO):


如果您发布从
Data::Dumper
获得的确切错误和$dice\u堆栈的确切内容,这将有所帮助。可以猜测引擎盖下面到底是什么,但我们不必猜测。使用更合适的
$[0]
可以避免由
@[0]
引起的警告。啊哈,您是对的,先生。在我的描述中(显然在我的代码中)遗漏了这一部分。谢谢。请注意:从Perl5.14开始,“pop”可以接受标量表达式,它必须包含对未lessed数组的引用。参数将自动取消引用。“流行音乐”的这一方面被认为是高度实验性的。在未来版本的Perl中,确切的行为可能会发生变化。@Joel:我对该“功能”相当不感兴趣,因为它不能按应有的方式自动激活推送。@Joel:
push$cities{$state},$city不会自动激活。您仍然必须使用
push@{$cities{$state}},$city第一次。这太傻了。@tchrist,好吧,那么
push
有点古怪(你认为这会在将来得到解决吗?),仍然
pop
应该可以,你不觉得吗?
  my ($dice_type) = @_;
  my $dice_list = $dice_stack->{$dice_type};
  return pop(@$dice_list);