从子程序中退出开关盒

时间:2014-10-08 17:30:51

标签: perl

我想知道如何从子程序中留下一个switch case元素:

#!/usr/bin/perl

use Switch;

switch ($command) {
    case 'create_vmr' {
        ... do something ...
        callsub($blabla);
        ... do something more ...
    }
    case 'delete_vmr' {
        ... do something ...
        callsub($blabla);
        ... do something more ...
    }
}

... final code ...

exit(0);

sub callsub {
    ... check something ...
    last if $condition;
}

我的想法是,来自callsub()的'last'将退出调用它的情况,以便代码将在switch elemeent之后继续。但这不起作用。如果我直接在case元素中调用它,'last'工作正常。

那么,我怎样才能将switch元素从sub?

中删除

编辑:我不想使用'转到'请;)

1 个答案:

答案 0 :(得分:3)

我建议不要试图通过隐藏休息来模糊你的程序流程。

相反,如果子例程成功,则使子例程返回一个真值,并从调用代码块中断。

在这种情况下,我建议使用调度表而不是deprecated Switch模块。以下内容应证明:

use strict;
use warnings;

my %dispatch = (
    create_vmr => sub {
        # ... do something ...
        callsub('foo') or return;
        # ... do something more ...
    },
    delete_vmr => sub {
        # ... do something ...
        callsub('bar') or return;
        # ... do something more ...
    },
);

my $command = 'delete_vmr';

if ( $dispatch{$command} ) {
    $dispatch{$command}();
} else {
    warn "Unrecognized $command";
}

exit(0);

sub callsub {
    # ... check something ...
    return $_[0] eq 'foo';
}