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

时间:2010-11-28 09:09:16

标签: 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;
        }
    }
}

2 个答案:

答案 0 :(得分:5)

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

当然,即使在数字错误编号中也会涉及一些繁琐的比特,因为每个平台都可能 某些错误编号。您可以通过查看EAGAIN中的密钥EAGAIN是否在当前系统上检查某个名称(例如exists)是否有错误编号,然后确定从何处开始那里 - 但它比字符串比较更可靠。

答案 1 :(得分:3)

我会说它没有,因为你依赖$!设置为Resource …字符串,我认为这不是开放函数的标准。你究竟想做什么?