【问题标题】:Runtime Error "Can't modify non-lvalue subroutine"运行时错误“无法修改非左值子例程”
【发布时间】:2011-05-03 09:00:18
【问题描述】:

我有一个包含 1 个或多个字符串的数组 @jobs,但是当我运行以下代码时,我收到运行时错误“无法在 /home/xa341d/bin/hourly.pl 行修改非左值子例程调用32"

elsif (@jobs > 0) {
    my $my_jobs = "";
    my $i;

   for ($i = 0; i <= $#jobs; i++) {
       my $temp = $jobs[$i];
       $my_jobs += "-j $temp ";
   }

   print "my_jobs = $my_jobs\n";
    open $alOut, "/home/zn035b/bin/autorep2.pl $my_jobs -l 0 | grep `date \"+%m/%d/%Y\"` | sort -k 3,3|" or die "Can't open: $!";
}

有人知道这里可能发生了什么吗?

【问题讨论】:

    标签: perl


    【解决方案1】:

    Perl 程序员会将 foreach 循环编写为:

    foreach my $job (@jobs) {
      $my_jobs .= "-j $job ";
    }
    

    或许:

    $my_jobs .= "-j $_ " foreach @jobs;
    

    C 风格的 for 循环在 Perl 中很少使用。并且有充分的理由。 foreach 循环通常很容易理解。

    你也可以用地图来做:

    my $jobs = join ' ', map { "-j $_" } @jobs;
    

    【讨论】:

    • 作为一个 C 风格的程序员并且没有太多的 perl 经验,我自然而然地选择了 C 风格,这种方式很有意义并且简化了整个事情。
    【解决方案2】:

    将此添加到脚本的顶部。

    use warnings;
    use strict;
    

    您会看到您在循环中使用i 而不是$i,并且还使用+= 而不是应该用于连接的.=。另一方面,+= 将右侧的数值(即 0,因为“-j”不是数字)添加到左侧。

    也就是说,我未能从此代码中获取“非左值子”消息,因此您可能应该提供更多信息或至少告诉我们line 32 是什么。

    【讨论】:

      【解决方案3】:

      你在这里错过了一个变量印记:for ($i = 0; $i &lt;= $#jobs; i++)。如果没有$ sigil,i 将被视为子例程名称。

      另外,这一点很可能是错误的:

       $my_jobs += "-j $temp ";
      

      由于$my_jobs 是一个字符串,您应该改用.= 运算符。

      【讨论】:

        【解决方案4】:

        像这样更正for循环 for ($i = 0; $i

        然后就好了。 您错过了变量 i 的 $ 符号。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-26
          • 1970-01-01
          • 1970-01-01
          • 2022-01-03
          相关资源
          最近更新 更多