代码之家  ›  专栏  ›  技术社区  ›  sid_com

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

  •  0
  • sid_com  · 技术社区  · 14 年前

    这种代码是否也适用于其他函数(而不是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 回复  |  直到 11 年前
        1
  •  3
  •   zoul    14 年前

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

        2
  •  5
  •   hobbs    14 年前

    它是一种模式,可以在其他情况下应用——但一般来说,您不想检查 $! 因为它依赖于系统库、用户的区域设置和类似的东西。在处理系统错误时,最好自己处理错误号,Perl有一种方法可以做到这一点——简而言之,您可以像 if ($!{EAGAIN}) { ... } (这是散列表中的查找 %! )只有当 $! 设置为错误号 EAGAIN . 要与旧的Perl兼容,您需要加载模块 Errno --它在5.8及更高版本上似乎是开箱即用的,但只要加载该模块就可以确保它在任何地方都能正常工作。

    当然,即使在数字错误数字中也会涉及一些非常精细的位,因为每个平台都可能不会。 某些错误号。您可以检查给定的名称(如 再次 )通过查看当前系统上的错误号 exists 在里面 %! ,然后找出从那里到哪里——但它仍然比字符串比较更可靠。