Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?

Can I break out of a subroutine before the end?

by Anonymous Monk
on Aug 30, 2000 at 12:24 UTC ( #30266=perlquestion: print w/replies, xml ) Need Help??
Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

You can break out of a subroutine by using the return keyword :

#!/usr/bin/perl -w use strict; sub test { my ($param) = @_; if ($param =~ /e/) { print "e found.\n"; return; }; print "No e found.\n"; }; &test( "test" ); &test( "toast" );
Note that jumping out of the middle of a subroutine is considered bad style by some people who do believe in the statement that every routine should have one entrypoint and one exit.

Replies are listed 'Best First'.
Re: Can I break out of a subroutine before the end?
by AcidHawk (Vicar) on Apr 30, 2003 at 08:20 UTC

    To simplify the given example and keep to the "one entry point one exit point to and from a subroutine" style, I would only add an else to the subroutines if statement Check the following:

    #!/usr/bin/perl -w use strict; sub test { my ($param) = @_; if ($param =~ /e/) { print "e found.\n"; } else { print "No e found.\n"; } }; &test( "test" ); &test( "toast" );
    I have also tried the following in case there are more than two options ie (more than true or false). I have only one entry point in a subroutine and one exit from that routine. It does mean though that I have to test the return value of the subroutine. Using the same example as above I could expand the tests (if statements) and the value that is returned, and then test these values later. E.g.
    #!/usr/bin/perl -w use strict; sub test { my ($param) = @_; my $rc = 0; if ($param =~ /e/) { $rc = 1; } elsif ($param =~ /a/) { $rc = 2; } return($rc); }; my @tsts = qw/ test toast kitty /; foreach my $word (@tsts) { my $ret_val = &test($word); if ($ret_val == 1) { print "E found\n"; } elsif ($ret_val == 2) { print "A found\n"; } else { print "A or E NOT found\n"; } }

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://30266]
[shmem]: msh210: but I'd not call it a lie outright. That's when you do know the truth.
[msh210]: I don't have sendmail (I'm on MS Windows), so does one of you think you can report the bug?
[shmem]: msh210: 'tis about time to tell the sad truth to perl5porters - via perlbug
[msh210]: probably whoever wrote that actually knows the truth
[shmem]: msh210: you can save the perlbug text in a file and send that via your mail agent of choice
[msh210]: hm, okay, I'll try, thanks
[shmem]: ...not as an attachment, it's probably better to c&p that into the mail body

How do I use this? | Other CB clients
Other Users?
Others about the Monastery: (12)
As of 2017-04-24 12:49 GMT
Find Nodes?
    Voting Booth?
    I'm a fool:

    Results (439 votes). Check out past polls.