perl:在使用"strict refs"时,不能将字符串用作ARRAY引用

jas*_*cks 8 arrays perl

我有这个问题,我试图将数组传递给sub,它读取其他一些值.在这个测试脚本中,我传递的是数组@players的引用,但是它的读取字符串是$ buffer.

use Data::Dumper;

my @players = [];
my @playerscores = [];
my %FORM;

my $buffer = "numplayers=2&changeplayers=3&CHANGEIT=CHANGEIT&player1=a&player2=b&restart=1&newcoords=";

sub testsub {
    my @testee = @$_[0];
    print "in testsub: $testee[0]\n";
}

my @holder = split(/&/,$buffer,);
foreach my $iter (@holder)
{
    my ($name,$value) = split(/=/,$iter);
    $FORM{$name} = $value;
}
$_ = $buffer;
foreach my $key (keys(%FORM))
{
    if($key=~ /player[1-9]/)
    {
        if(!($FORM{$key} eq ""))
        {
            my $holder = $key;
            $holder =~ s/player//;
            $players[$holder] = $FORM{$key};
            $playerscores[$holder] = 0;
            $_ = $buffer;
        }
    }
}

print "\n Data Dumper on player:\n";
print Dumper(@players);
print "\n\n";

print "Check sub:\n";
testsub(\@players,\@playerscores);
Run Code Online (Sandbox Code Playgroud)

输出:

 Data Dumper on player:
$VAR1 = [];
$VAR2 = 'a';
$VAR3 = 'b';


Check sub:
Can't use string ("numplayers=2

&changeplayers=3&CHA"...) as an ARRAY ref while "strict refs" in use at test-str-pool2.pl line 15.
Run Code Online (Sandbox Code Playgroud)

而我期待"a"或"b"作为结果print "in testsub: $testee[0]\n";.为什么会这样?

Rob*_*arl 9

您正在错误地声明您的数组,这就是Dumper输出具有[](空数组引用)作为第一个元素的原因@players.使用:

my @players = ();
my @playerscores = ();
Run Code Online (Sandbox Code Playgroud)

第二个错误来自:

my @testee = @$_[0];
Run Code Online (Sandbox Code Playgroud)

这会尝试取消引用$_并从结果数组中获取第一个元素.你的意思是:

my @testee = @{$_[0]};
Run Code Online (Sandbox Code Playgroud)

从第一个元素中取出@_并取消引用它.