运行时错误“无法修改非左值子程序”

时间:2011-05-03 09:00:18

标签: perl

我有一个包含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: $!";
}

有谁知道这里会发生什么?

4 个答案:

答案 0 :(得分:8)

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

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

或者也许:

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

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

您也可以使用地图:

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

答案 1 :(得分:6)

将此添加到脚本的顶部。

use warnings;
use strict;

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

那就是说,我没有从这段代码中得到“非左值子”消息,所以你可能应该提供更多信息或者至少告诉我们line 32是什么。

答案 2 :(得分:3)

你错过了一个变量sigil:for ($i = 0; $i <= $#jobs; i++)。如果没有$ sigil i被视为子程序名称。

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

 $my_jobs += "-j $temp ";

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

答案 3 :(得分:1)

像这样纠正for循环 for($ i = 0; $ i&lt; = $ #jobs; $ i ++)

然后就可以了。 你错过了变量i的$符号。