Arrays 如何从hashref中的数组中弹出?
大脑在这件事上变得模糊了。我想让我的骰子游戏从使用rand()变成使用random.org上的随机值列表。我能够很好地检索这些值,只是挂断了从列表中弹出的语法 这是我的功能,让我适合: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),值是
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);