Ошибка во время выполнения "Не могу изменить подпрограмму, не имеющую значения" - PullRequest
2 голосов
/ 03 мая 2011

У меня есть массив @jobs, который содержит 1 или более строк, но когда я запускаю следующий код, я получаю ошибку во время выполнения: «Невозможно изменить вызов подпрограммы не lvalue в строке /home/xa341d/bin/hourly.pl32 "

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 ]

8 голосов
/ 03 мая 2011

Программист на Perl написал бы этот цикл foreach как:

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

Или, возможно:

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

C-стиль для циклов редко используется в Perl. И не зря. Цикл foreach обычно легко понять.

Вы также можете сделать это с картой:

my $jobs = join ' ', map { "-j $_" } @jobs;
6 голосов
/ 03 мая 2011

Добавьте это в начало скрипта.

use warnings;
use strict;

Вы увидите, что вы используете i вместо $i в цикле, а также += вместо .=, который следует использовать для объединения. +=, с другой стороны, добавляет числовое значение с правой стороны (которое равно 0, поскольку «-j» не является числом) с левой стороны.

Тем не менее, мне не удалось получить сообщение "non-lvalue sub" из этого кода, поэтому вы, вероятно, должны предоставить больше информации или, по крайней мере, сказать нам, что такое line 32.

3 голосов
/ 03 мая 2011

Вы пропустили здесь переменную сигилу: for ($i = 0; $i <= $#jobs; i++).Без $ sigil i обрабатывается как имя подпрограммы.

Кроме того, этот бит, вероятно, неверен:

 $my_jobs += "-j $temp ";

Поскольку $my_jobs - строка, которую вы должны использоватьвместо этого оператор .=.

1 голос
/ 03 мая 2011

Исправьте цикл for следующим образом для ($ i = 0; $ i <= $ # заданий; $ i ++) </p>

Тогда все будет хорошо. Вы пропустили знак $ для переменной i.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...