Будет ли этот код работать для других функций? - PullRequest
0 голосов
/ 28 ноября 2010

Этот вид кода работает и для других функций (вместо dbmopen), который открывает файл и возвращает false при сбое?

my $n_tries = 5;
while ($n_tries--) {
    if (dbmopen (%CHOICES, &dbm_file(), 0600)) {
        last;
    } else { 
        if ($! eq 'Resource temporarily unavailable') {
            my $wait = rand 0.45; select undef, undef, undef, $wait;
        } else { return;
        }
    }
}

Ответы [ 2 ]

5 голосов
/ 29 ноября 2010

Это шаблон, который может применяться в других случаях - но обычно вы не хотите проверять строковое значение $!, потому что оно зависит от системных библиотек, языкового стандарта пользователя и тому подобного.При работе с системными ошибками лучше всего работать с самими номерами ошибок, и у perl есть способ сделать это - вкратце, вы можете выполнить проверку, например if ($!{EAGAIN}) { ... } (это поиск в хэше %!) иЗначение будет истинным, только если для $! установлено значение ошибки EAGAIN.Чтобы быть совместимым со старыми Perl, вам нужно загрузить модуль Errno - кажется, он работает "из коробки" на 5.8 и новее, но только загрузка этого модуля гарантирует его работоспособность везде.

Конечно, существуют даже некоторые числовые биты, даже в числовых числах ошибок, поскольку каждая платформа не может иметь определенные номера ошибок.Вы можете проверить, есть ли у данного имени (например, EAGAIN) номер ошибки в текущей системе, посмотрев, есть ли этот ключ exists в %!, и затем выяснить, куда идти дальше - но это все ещенадежнее сравнения строк.

3 голосов
/ 28 ноября 2010

Я бы сказал, что это не так, потому что вы полагаетесь на $!, установленную на строку Resource …, что я не считаю стандартом для открытых функций.Что именно вы пытаетесь сделать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...