Как мне ничего не вернуть из подпрограммы? - PullRequest
4 голосов
/ 22 октября 2009

Я хочу проверить условие перед выполнением следующего шага, но только вызвать предупреждение и пропустить текущее значение вместо смерти.

Как переписать функцию validate_me () без возврата какого-либо значения?

(Обновление) обратите внимание, что следующий код работает как положено, просто я хочу что-то другое вместо возврата 1 или 0 из validate_me (), которые все еще позволяют коду вести себя так же. 1007 *

foreach my $file ( @files ) {
    validate_me($foo, $bar, $baz) or next;
    do_something();
}  

sub validate_me {
    my ($foo, $bar) = @_;

    if ( $foo > $bar ) {
        carp("Something goes awol");
        return 0;
    }

    if ( $bar != $baz ) {
        carp("Odd");
        return 0;
    }

    return 1; # success
}

Спасибо.

Ответы [ 5 ]

9 голосов
/ 22 октября 2009

Проверьте документацию на возврат . Если вы не хотите ничего возвращать, не возвращайте аргумент:

 return;
2 голосов
/ 22 октября 2009

Во-первых, нет смысла использовать метку в вашем цикле, next; сам автоматически выполнит следующую итерацию окружающего цикла.

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

1 голос
/ 22 октября 2009

return; просто завершит функцию, без вопросов.

Но если вам интересно, вы также можете возвращать значения, используя указатели / ссылки, переданные в вашу функцию в качестве параметров.

void foo(int input, outStruct *output) {
...
output = new outStruct(...); //for example;
return;
};

EDIT Я дебил, который не умеет читать теги / код. Пример на C / C ++, а не на Perl. OOps.

1 голос
/ 22 октября 2009

Обновление:

Мне нужно что-то еще вместо возврата 1 или 0 из validate_me (), которое все еще позволяет коду вести себя одинаково.

Это то, что вы имеете в виду? См. eval.

my @files = qw( a b c d e f );

FILES:
foreach my $file ( @files ) {
    eval { validate_me($file) };
    if (my $ex = $@) {
        warn "'$file' failed validation: $ex";
        next FILES;
    }
    print "$file passed\n";
}

sub validate_me {
    my ($file) = @_;
    die "Invalid filename\n" if 0.5 > rand;
    return; # explicitly return nothing
}

Теперь разумно было бы провести рефакторинг validate_me в его компоненты:

for my $file ( @files ) {
    if ( is_something_gone_awol($file, $mile) ) {
        warn "Something has gone awol: '$file' and '$mile'\n";
    }
    elsif ( is_something_odd($file, $smile) ) {
        warn "Something is odd: '$file' and '$smile'\n";
    }
    else {
        do_something($file);
    }
}

sub is_something_gone_awol {
    my ($foo, $bar) = 0;
    return $foo gt $bar;
}

sub is_something_odd {
    my ($bar, $baz) = @_;
    return $bar ne $baz;
}
0 голосов
/ 22 октября 2009

Вы можете return undef или просто return.

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