给出了太多的论点;它预计1(Perl)

时间:2016-07-22 00:50:30

标签: perl

我一直在制作一款卡牌游戏,可以获得你的套牌,并选择三张牌中的一张,但每当我尝试运行它时,它都会给我一个错误

错误:

Error: In call to CPUser::addCards(), was given too many arguments; it expects 1 at Server/CPUser.pm line 427.

第427行:

 if($intItem == 821){ #Adds Card Jitsu Cards for Classic 
             $self->addCards($self->buildStarterDeck); 
       }

这就是buildStarterDeck方法

method buildStarterDeck {

    sub get_cards;
    my (@stackone, @stacktwo) = get_cards;

    sub get_cards 
    {
        my @start_cards = (1, 6, 9, 14, 17, 20, 22, 23, 26);
        my @power_cards = (73, 81, 89);
        @power_cards = $power_cards[rand @power_cards];

    return (@start_cards, @power_cards);
    }
}

addCard方法是空的,因为我一直在试图找出这个错误而且我没有运气。

1 个答案:

答案 0 :(得分:4)

问题在于您对addCards的定义,尽管有多个请求要求我们保留这些内容。它必须看起来像这样

method addCards($param) {
    ...;
}

但是你在$self->addCards($self->buildStarterDeck)中传递了一个十元素列表,因此引发了given too many arguments错误。你没有解释你想要它做什么,但这样的事情可能更合适

method addCards(@cards) {
    ...;
}

你真的不应该在其他子程序中声明子程序。它不限制内部子例程的范围,但是您可以在外部子例程中声明的无法正常工作的变量上创建闭包

同时请注意评论中的zdim's warning,您的代码应该更像这样

use strict;
use warnings 'all';

use Method::Signatures;

method buildStarterDeck {

    my @stack = get_cards;
}

sub get_cards {

    my @start_cards = (1, 6, 9, 14, 17, 20, 22, 23, 26);
    my @power_cards = (73, 81, 89);

    $power_card = $power_cards[rand @power_cards];

    return (@start_cards, $power_card);
}