这段代码是否适用于其他功能?

sid*_*com 0 perl file

这种代码是否也适用于其他函数(而不是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)

hob*_*bbs 5

这是一种可以应用于其他情况的模式 - 但通常你不想检查字符串的值$!,因为它依赖于系统库,用户的语言环境以及类似的东西.在处理系统错误时,最好使用错误号本身,并且perl有一种方法可以做到这一点 - 简而言之,你可以做一个检查if ($!{EAGAIN}) { ... }(这是哈希中的查找%!),并且只有在$!设置为错误号EAGAIN.要与旧的perls兼容,您需要加载模块Errno - 它似乎在5.8及更高版本上开箱即用,但只需加载该模块即可确保它在任何地方都能正常工作.

有,当然,即使在数字错误号码参与一些繁琐位,因为每个平台可能不具备一定的误差数.您可以检查是否一个给定的名称(如EAGAIN)通过查看该密钥具有当前系统上的错误数量exists%!,然后找出其中从那里去-但它仍然比字符串比较更可靠.