【问题标题】:Why does Perl complain "can't modify non-lvalue subroutine call"?为什么 Perl 抱怨“不能修改非左值子程序调用”?
【发布时间】:2011-02-09 14:35:50
【问题描述】:

我有 index.plsubs.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() 返回一条消息和从getage() 发送的date($dob)

来自 validate() 的一些代码:

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

【问题讨论】:

  • 你将不得不给我们更多的代码来帮助我们能够回答你。一方面,Validate 返回什么。另外什么是“列表”。
  • @Karya 得到了解决方案列表是我认为列表会“列出”返回值的问题。删除单词“列表”起到了作用..无论如何问题已修改,谢谢

标签: perl


【解决方案1】:

解决方案似乎是:

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

基于我对该代码意图的直观理解 - 但在您提供更多上下文之前我无法确定(validate() 返回什么,list() 是什么意思?)

如果您的意思是 list() 作为强制 $val 和 @value 进入列表的一种方式,您只需将两者括在括号中:($val, @value) 即可

【讨论】:

  • 仅供参考 list() 是用于解构列表分配的 PHPism。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    排队

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

    删除“列表”,它工作正常

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

    感谢 Kayra 和其他回答的人

    【讨论】:

    • my 通常在括号之外:my($val, @value) = validate($dob);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    • 2011-01-27
    • 2015-06-09
    相关资源
    最近更新 更多