http://qs321.pair.com?node_id=181789

We were reviewing the following code for part of a membership site I've been working on when another developer pointed out that I used a goto and this was evil. The code is:

RE_TIE: eval { tie %session, 'Apache::Session::MySQL', $session, { Handle => HH::DB->db_Main, LockHandle => HH::DB->db_Main } }; if ($@) { if ($@ =~ /^Object does not exist/) { $session = undef; goto RE_TIE; } else { print $cgi->header; die_nice('Database Error', 'Unable to connect at this time'); } }

The goto is to handle a "shouldn't really happen" case (somebody sending us a session id which is invalid). I like the use of goto because it doesn't distract from the "normal" case which a loop would. He suggested:

my $tied = 0; while (!$tied) { eval { tie %session, 'Apache::Session::MySQL', $session, { Handle => HH::DB->db_Main, LockHandle => HH::DB->db_Main }; if ($@) { if ($@ =~ /^Object does not exist/) { $session = undef; } else { print $cgi->header; die_nice('Database Error', 'Unable to connect at this time +'); } } else { $tied = 1; } }

Personally I think this is harder to read and it makes you read through to work out how the loop is exited.

I was wondering what the general consensus here was, is goto (in this case) really evil?

gav^