为什么Perl抱怨“无法修改非左值子程序调用”?

时间:2010-04-19 08:51:44

标签: perl

我有 index.pl subs.pl 。当我运行程序时,用户插入出生日期,然后将其传递给 subs.pl 中的getage()子程序,该子程序有许多子程序。 getage()比隐式调用另一个名为validate()的子例程,它验证用户输入的日期。

当我运行 index.pl 并且用户输入日期03-04-2005时,会出现以下错误:

  

不能修改subs.pl第85行的非左值子程序调用,<>第1行

subs.pl 的第85行,我有:

list(my $val,my @value) = validate($dob);

validate()会返回一条消息以及date($dob)发送的getage()

来自validate()的一些代码:

sub validate {
    my $dob = shift;
    my $error;
    my @test;
    @test = split("-",$dob);
    if (!@test) {
        $error = "date separator should be - ";
        return ($error,@test);
    }
    ...

3 个答案:

答案 0 :(得分:4)

解决方案似乎是:

my ($val, @value) = validate($dob);

基于我对该代码的意图的直观理解 - 但我不能确定,直到你提供更多的上下文(validate()返回什么,list()是什么意思?)

如果你想将list()作为强制$ val和@value加入列表的方法,你只需要将它们括在括号中:($val, @value)来做那个

答案 1 :(得分:1)

左值是您可以修改的变量。 (一个可以在作业的左侧,因此名称)。在大多数情况下,sub返回的值是而不是您可以修改的值。

在您的示例中,您正在尝试这样做:将validate($dob)的返回值分配给list($val, @value)的不可修改的返回值。

答案 2 :(得分:0)

在行

list(my $val,my @value) = validate($dob);

删除'list'并且工作正常

(my $val,my @value) = validate($dob);

感谢 Kayra 和其他回答

的人