为什么这些值有时未定义?

Why are these values sometimes undefined?

我对 Perl 还很陌生,正在做一个项目来进一步学习。这是一个小型控制台文字游戏(翻译自我的python项目),部分逻辑需​​要从98个字符长的池中随机抽取一个字母。

运行 单独的函数,我从来没有遇到过问题,但是当我尝试将它循环到列表中时,它偶尔会失败。 运行 上的警告告诉我其中一些未定义,但我终究无法弄清楚 为什么 。这是一个 MRE:

package Random;
sub choice {
  shift;
  my ($str) = @_;
  my $random_index = int(rand(length($str)));
  return substr($str,$random_index,1); #fixed variable name
}
package Player;
sub new {
  my $class = shift;
  my $self = { "name" => shift, "letters" => {fillList()} };
  bless $self, $class;
  return $self;
}
sub drawCharacter {
  my $freq = "aaaaaaaaabbccddddeeeeeeeeeeeeffggghhiiiiiiiiijkllllmmnnnnnnooooooooppqrrrrrrssssttttttuuuuvvwwxyyz";
  my $choice = Random -> choice($freq);
  return $choice;
}
sub fillList {
  my @ls = ();
  for (0..6) {
    push @ls, drawCharacter();
  }
  return @ls;
}
sub getLetters {
  my ($self) = @_;
  my $arr = $self -> {letters};
  return %$arr;
}


package Main;
my @players = ();
for (0..12){
  my $player = Player -> new("Foo");
  print($player->getLetters(),"\n");
}

大编辑:添加我正在使用的对象。这可证实不起作用。警告: “在打印中使用未初始化的值”和“匿名散列中的奇数元素”。这就是我认为的问题所在。

fillList 返回的列表有时会缺少一个或两个项目,在某些情况下甚至会缺少 3 或 4 个项目。有人知道这里发生了什么吗? python 没有失败过一次。

如果 python 类似物有帮助,我也可以将其包含在这里。

错误来自使用散列引用,而您应该有一个数组引用:

my $self = { "name" => shift, "letters" => {fillList()} };
#                                          ^          ^-- wrong brackets

这就是警告所说的内容:

Odd number of elements in anonymous hash at foo.pl line 22.

您想将其更改为:

my $self = { "name" => shift, "letters" => [fillList()] };
#                                          ^          ^--- creates array ref

还有使用这个数组的行

return %$arr;

需要将%改为@的地方。

return @$arr;

在这些修复之后,我的代码运行没有错误。