Почему Perl жалуется на то, что «не может изменить вызов подпрограммы без значения»? - PullRequest
3 голосов
/ 19 апреля 2010

У меня есть index.pl и subs.pl . Когда я запускаю программу, пользователь вставляет дату рождения, а затем она передается в подпрограмму getage() в subs.pl , в которой есть много подпрограмм. getage(), чем неявно вызывает другую подпрограмму с именем validate(), которая проверяет дату, введенную пользователем.

Когда я запускаю index.pl и пользователь вводит дату как 03-04-2005, появляется следующая ошибка:

не может изменить вызов подпрограммы без значения в строке subs.pl 85, <> строка 1

На 85-й строке subs.pl У меня есть:

list(my $val,my @value) = validate($dob);

validate() возвращает сообщение и date($dob), которое отправляется с getage().

Некоторый код из validate ():

sub validate {
    my $dob = shift;
    my $error;
    my @test;
    @test = split("-",$dob);
    if (!@test) {
        $error = "date separator should be - ";
        return ($error,@test);
    }
    ...

Ответы [ 3 ]

4 голосов
/ 19 апреля 2010

Решение выглядит следующим образом:

my ($val, @value) = validate($dob);

основано на моем интуитивном понимании того, что этот код предназначался - но я не могу быть уверен, пока вы не предоставите больше контекста (что возвращает validate(), что означает list()?)

Если вы имели в виду list () как средство принудительного включения $ val и @value в список, вам просто нужно заключить оба в круглые скобки: ($val, @value) для этого

2 голосов
/ 19 апреля 2010

lvalue - это переменная, которую вы можете изменить. (тот, который может быть слева от назначения, отсюда и название). В большинстве случаев значение, возвращаемое подпрограммой, равно , а не , которое вы можете изменить.

В вашем примере вы пытаетесь именно это: присвоить возвращаемое значение validate($dob) неизменяемому возвращаемому значению list($val, @value).

0 голосов
/ 19 апреля 2010

в строке

list(my $val,my @value) = validate($dob);

удалить 'список' и все работает нормально

е

(my $val,my @value) = validate($dob);

спасибо Кайре и другим, кто ответил

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