我有一个包含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: $!";
}
有谁知道这里会发生什么?
答案 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的$符号。