如何从子程序中返回任何内容?

时间:2009-10-22 01:36:19

标签: perl

我想在进行下一步之前验证一个条件,但只提出警告并跳过当前值而不是死亡。

如何在不返回任何值的情况下重写validate_me()子例程?

(更新)请注意,以下代码按预期工作,只是我想要其他东西,而不是从validate_me()返回1或0仍然允许代码行为相同。

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 个答案:

答案 0 :(得分:9)

查看return的文档。如果你想什么都不返回,不要给返回一个参数:

 return;

答案 1 :(得分:2)

首先,没有理由在循环中使用标签,next;本身会自动执行封闭循环的下一次迭代。

关于你的问题,我对你想要完成的事情感到有些困惑。如果您的任何测试失败,那么您编写的代码将从validate_me返回零,这是一个错误值,这应该导致循环的下一次迭代。 validate_me中没有任何内容会导致任何事情死亡。

答案 2 :(得分:1)

更新:

  

我想要其他东西,而不是从validate_me()返回1或0,仍然允许代码表现相同。

这是什么意思?请参阅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;
}

答案 3 :(得分:1)

return;将结束此功能,不会提出任何问题。

但是如果你想知道,你也可以通过使用作为参数传递给函数的指针/引用来返回值。

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

修改 我是个白痴,无法阅读标签/代码。该示例使用的是C / C ++,而不是Perl。 糟糕

答案 4 :(得分:0)

您可以 return undef return