为什么这些值有时未定义?
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;
在这些修复之后,我的代码运行没有错误。
我对 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;
在这些修复之后,我的代码运行没有错误。