@Orbite

Как уменьшить большое условие if?

Всем доброго времени суток!
Есть большое условие, нужно уменьшить его до приемлемых размеров, несколько часов уже над ним сижу. Может кто помочь укоротить его при этом сохранив всю логику?
if ($contr_type == 0) {
            if ($contr_doc_id != 4) {
                if ($contr_doc_id == 1 && ($contr_ser_doc =~ /\D/g || $contr_num_doc =~ /\D/g)) {
                    if (!$contr_bday) {
                        $personal_data = '1. паспорт и дата рождения';
                    } else {
                        $personal_data = '2. паспорт';
                    }
                } else {
                    if ($contr_ser_doc && $contr_num_doc && $contr_bday) {
                        $personal_data = 'Ок';
                    } elsif ((!$contr_ser_doc || !$contr_num_doc) && !$contr_bday) {
                        $personal_data = '1. паспорт и дата рождения';
                    } elsif ((!$contr_ser_doc || !$contr_num_doc) && $contr_bday) {
                        $personal_data = '2. паспорт';
                    } elsif (($contr_ser_doc && $contr_num_doc) && !$contr_bday) {
                        $personal_data = '3. дата рождения';
                    }
                }
            } else {
                if (($contr_ser_doc || $contr_num_doc) && $contr_bday) {
                    $personal_data = 'ОК';
                } elsif (!$contr_ser_doc && !$contr_num_doc && !$contr_bday) {
                    $personal_data = '1. паспорт и дата рождения';
                } elsif ((!$contr_ser_doc && !$contr_num_doc) && $contr_bday) {
                    $personal_data = '2. паспорт';
                } elsif (($contr_ser_doc || $contr_num_doc) && !$contr_bday) {
                    $personal_data = '3. дата рождения';
                }
            }
        } elsif ($contr_type == 1) {
            if ($contr_ip == 1) {
                if ($contr_inn) {
                    $personal_data = 'Ок';
                } else {
                    $personal_data = '2. Нет ИНН';
                }
            } else {
                if ($contr_inn && $contr_kpp) {
                    $personal_data = 'Ок';
                } elsif (!$contr_inn && $contr_kpp) {
                    $personal_data = '2. Нет ИНН';
                } elsif ($contr_inn && !$contr_kpp) {
                    $personal_data = '3. Нет КПП';
                } else {
                    $personal_data = '1. Нет ИНН и КПП';
                }
            }
        }
  • Вопрос задан
  • 115 просмотров
Пригласить эксперта
Ответы на вопрос 1
@pcdesign
1) Можно попробовать подобрать один из модулей Switch, который покажется наиболее удобным:
https://metacpan.org/search?q=module%3ASwitch

2) Перевести всю логику в хэши, вот по такому образцу:
my %password = (
    'tom' => '123!',
    'frank' => '321!',
);

if ( exists $password{$name} && $password eq $password{$name} ) {
# что-то делаем
}


3) Вместо магических цифр $contr_doc_id != 4 , можно использовать константы

use constant {
    FOO => 4,
    BAR => 5
};

https://perldoc.perl.org/constant.html
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы