【问题标题】:Show error if pm library doesn't exist如果 pm 库不存在则显示错误
【发布时间】:2016-02-26 12:05:39
【问题描述】:

这个“有趣”的困境

要在 perl 中使用 lib,您显然包含“use lib x”命令...但是如果“x.pm”不存在,您该怎么办,(或者更准确地说,有机会被服务器管理员删除)

简而言之,我将这个文件与我帐户根目录中的 .htaccess 和其他文件一起“隐藏”在我的帐户根目录下,即“public_html”文件夹下方 - 以防止其被窥探。所以我可以在脚本中设置路径,比如“使用/home/account/x”,一切都很好。

过去,我认为安全措施意味着该文件有时会被删除。因此,当脚本运行时,查看者会看到一个光荣的“500 错误”

我试过了:

 If (-e 'use /home/account/x'){
 use 'home/account/x';
 ...
 }
 else{
 print "error";
 }

但它所做的只是说它在“If”下面的行中找不到使用命令

试过了:

use 'home/account/x' || die ('cannot find file')

但是那个语法是错误的。有什么简单的方法吗?

【问题讨论】:

    标签: perl


    【解决方案1】:

    这与何时可以“注意到”错误有关。 use 发生在编译时间。因此 - 你不能做很多你会做的正常程序流程的事情。 (有一些例外)。

    但是你可以做的是require,它在运行时加载东西——在那个时候你可以做你想要的那种测试。

    #!/usr/bin/env perl
    use strict;
    use warnings;
    
    eval { require "Not_here.pm" };
    warn "Couldn't load: $@" if $@;
    print "fish";
    

    虽然,您可能还需要import 所需的例程,在requiring 模块之后,因为use 这样做:

     BEGIN { require Module; Module->import( LIST ); }
    

    【讨论】:

    • 你也可以串evaluse
    【解决方案2】:

    我使用字符串eval 来检查一个模块是否存在,如果没有它我是否可以运行。

    our $have_unac = 0;
    BEGIN {
        eval "use Text::Unaccent::PurePerl";
        $have_unac = 1 if (!$@);
    }
    

    【讨论】:

    • 目前 - 除非有相反的建议 - 我已经将两者“混搭”起来。想法。我用过: eval(require "x.pm"); if ($@){print error}else{BEGIN{eval "use x"} qfrvjqf 1_!l_I1_1nbjm_obsg1_ldhj-ajm1_lnk_fq ... data to be decoded by library no x} 所以如果第一个 require 找不到文件,打印一个错误,但如果发现,else 语句中的 BEGIN 将加载库并解码数据。它有效,但我不知道它是否遵循正确的约定。
    • 这是不可取的。首先BEGIN 块无论如何都会运行,并且在脚本中的任何其他内容之前。其次,在使用后尝试要求它可能会产生副作用。 (我没有考虑太多。)你应该使用我的版本或@Sobrique 的
    猜你喜欢
    • 2019-02-17
    • 2023-03-28
    • 1970-01-01
    • 2022-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    • 2015-07-10
    相关资源
    最近更新 更多