这种代码是否也适用于其他函数(而不是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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是一种可以应用于其他情况的模式 - 但通常你不想检查字符串的值$!,因为它依赖于系统库,用户的语言环境以及类似的东西.在处理系统错误时,最好使用错误号本身,并且perl有一种方法可以做到这一点 - 简而言之,你可以做一个检查if ($!{EAGAIN}) { ... }(这是哈希中的查找%!),并且只有在$!设置为错误号EAGAIN.要与旧的perls兼容,您需要加载模块Errno - 它似乎在5.8及更高版本上开箱即用,但只需加载该模块即可确保它在任何地方都能正常工作.
有,当然,即使在数字错误号码参与一些繁琐位,因为每个平台可能不具备一定的误差数.您可以检查是否一个给定的名称(如EAGAIN)通过查看该密钥具有当前系统上的错误数量exists的%!,然后找出其中从那里去-但它仍然比字符串比较更可靠.
| 归档时间: |
|
| 查看次数: |
144 次 |
| 最近记录: |