LINUX.ORG.RU

perl без goto


0

0

Никак не могу придумать, как нормально обойтись без goto
примерно такой код:

#!/usr/bin/perl -w

use strict;

use CGI;
use HTML::Template;

use settings;
use session;
use content;
use db;
use user;

our $cookie = "";
&session::load();
our $template;

my $action = &CGI::url_param('action');
$action = "" if not defined($action);
if ($action eq "") {
    if ($user::status < 10) {
        $template = HTML::Template->new(filename=>'error.tmpl');
        $template->param('message'=>'Вы не имеете доступа к этой странице');
    }
    else {
        &db::sql('SELECT U_ID, U_NAME, U_STATUS FROM USER;');        
        $template = HTML::Template->new(filename=>'users_view.tmpl');
        ...
    }
}

&set_page_content();

print &CGI::header(-cookie=>$cookie, -charset=>'koi8-r');
print $template->output();



Собственно приходится для контроля ошибок использовать конструкции вроде

if (ошибка) {
    Обработка ошибки;
}
else {
    Нормальное продолжение;
    if (ошибка) {
        Обработка второй ошибки;
    }
    else {
        Нормальное продолжение;
    }
}

Завершение;


Секция завершения должна выполняться всегда. Когда много ошибок, получается некрасивый код. goto пользовать не хочу ибо табу :-) Есть ещё более кривой вариант
if (ошибка)
    Обработка ошибкиж
    Завершение;
    exit;
}
Нормальное продолжение;
Завершение;

В этом случае придётся многократно копировать Завершение, что тоже не очень хорошо.
Как бы сделать здесь получше?

PS Если будут замечания по самому коду, тоже приму с благодарностью, потому что на перле только учусь писать
★★★★★

Работает?Жалобы есть? Если нет, то оставь как есть, вот в ядре до фига таких goto как рвз для обработки ошибок

anonymous
()
Ответ на: комментарий от guardian

> eval("шибко глючный код") есть. Его и юзать.

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

Legioner ★★★★★
() автор топика

А просто процедурой оформить?

sub Do {
<action1>
if (<error>) {
<some code>
return;
}
<action2>
if (<error>) {
<some code>
return;
}
...
}

roller ★★★
()
Ответ на: комментарий от roller

roller пральна грит.

# some init code goes here...

my $res = action(%some_params);
if ($res){
   # show error message to user
}

# end block goes here
...
exit;


sub action {
  my %param = @_;
  ...
  return "Error message" if ($err);
  ...
  return 0;

}

anonymous
()
Ответ на: комментарий от roller

Спасибо, я правда уже сам догадался так сделать. Почему-то на перле у меня всё время возникает соблазн писать неструктурированные программы..

Legioner ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.