这种代码是否也适用于其他函数(而不是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;
}
}
}
答案 0 :(得分:5)
这是一种可以应用于其他情况的模式 - 但通常你不想检查$!
的字符串值,因为它依赖于系统库,用户的语言环境等等。在处理系统错误时,最好使用错误号本身,perl有办法做到这一点 - 简而言之,你可以像if ($!{EAGAIN}) { ... }
那样进行检查(这是哈希中的查找{{1} })仅当%!
设置为错误编号$!
时,该值才为真。要与旧的perls兼容,您需要加载模块Errno - 它似乎在5.8及更新版本上开箱即用,但只需加载该模块即可确保它在任何地方都能正常工作。
当然,即使在数字错误编号中也会涉及一些繁琐的比特,因为每个平台都可能 某些错误编号。您可以通过查看EAGAIN
中的密钥EAGAIN
是否在当前系统上检查某个名称(例如exists
)是否有错误编号,然后确定从何处开始那里 - 但它比字符串比较更可靠。
答案 1 :(得分:3)
我会说它没有,因为你依赖$!
设置为Resource …
字符串,我认为这不是开放函数的标准。你究竟想做什么?