2011-05-03 40 views
2

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

沒有人知道可能會在這裏嗎?

回答

8

一個Perl程序員會編寫foreach循環爲:

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

又或者:for循環

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

C風格的Perl中很少使用。理由很充分。 foreach循環通常很容易理解。

你也可以用地圖做:

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

作爲更多的是C風格的程序員,並沒有在Perl很多的經驗,我自然地與C風格去,這樣纔有意義,並簡化了整個事情。 – Brandon 2011-05-03 10:31:17

3

您在這裏錯過了一個變量印記:for ($i = 0; $i <= $#jobs; i++)。如果沒有$印記i被視爲子程序名。

此外,該位可能是錯誤的:

$my_jobs += "-j $temp "; 

由於$my_jobs是你應該使用.=運營商,而不是一個字符串。

6

一下添加到腳本的頂部。

use warnings; 
use strict; 

你會看到,你在循環中使用i代替$i,並且也+=代替.=應當用於級聯。 +=,另一方面,增加了右側的數值(其爲0,因爲「-j」不是數字)到左側。

這就是說,我沒有得到這個代碼中的「非左值子」消息,所以你可能應該提供更多的信息或者至少告訴我們line 32是什麼。

1

更正爲這樣 for循環($ I = 0; $ I < = $#作業; $ I ++)

然後這將是確定。 您錯過了變量i的$符號。