【问题标题】:Exit If a perl pm is not available [duplicate]退出如果 perl pm 不可用 [重复]
【发布时间】:2016-07-29 16:33:37
【问题描述】:

概念:一个库放在我的 public_html 文件夹中,它的目的是解码一个字符串。但是,如果该库不存在,则停止并出现错误。之前建议的方式是:

eval("require x.pm");

if ($@) {
    print "The library is missing";
}
else{

    BEGIN{
        eval{"use x"};
    }

    1123131323fsdfsfsdfsfgdfgdfgghfghfghfgheterterter ...
    no x;
}

如果库存在,解码工作正常,一切都是“Hunky Dory”。理论上......如果文件不存在,顶部循环应该打印一个错误......除了发生的所有事情是我得到一个错误 500,因为脚本看到了加密的字符串,并确定它不是一个有效的程序。

想知道是不是“$@”所以我用标志试了一下

$set=0;
$set=1 if eval("require x.pm");

if ($set eq 0){
...
..

同样的事情。尝试将代码放入字符串中:

$_="1123131323fsdfsfsdfsfgdfgdfgghfghfghfgheterterter ..."

这没有帮助。那么任何人都可以阐明我做错了什么吗?

【问题讨论】:

  • 我不清楚您希望 perl 对 1123131323fsdfsfsdfsfgdfgdfgghfghfghfgheterterter ... 做什么。不管加载了哪些模块,程序仍然需要编译。解码字符串涉及将编码的字符串传递给解码子程序。此外,BEGIN{ eval{"use x"}; } 将在 编译时,在 require 之前完成,并且独立于您放入的条件语句
  • “如果库存在,则解码工作正常” 我无法想象您的模块 x 中可能包含什么来编译该代码。 no x 不会做任何有用的事情,除非你的模块有 unimport 方法
  • 不是 Sobrique 和 bolav suggested 的方式,所以请不要声称它是。你读博拉夫的评论了吗? BEGIN 块将在编译时无条件执行,在其他任何事情之前。
  • 我没有意识到这是一个后续问题。我注意到您说 “目前 - 除非被告知相反 - 我已经将这两个想法“混合”在一起。”bolav replies “这是不可取的......”请注意您的建议。听起来所有这些都是为了让你的 Perl 代码不可读,这总是徒劳的,只会让你自己的工作更难

标签: perl eval require


【解决方案1】:

看起来你并没有以任何方式退出。这是使用eval() 做你想做的事的稳定方法,使用exit()。如果require() 失败,$ok 将不会设置为真值。

my $ok = eval {require 'nofile.pm'; 1};

if (! $ok){
    print "module not found\n";
    exit;
}

【讨论】:

  • 抱歉,在我打字的匆忙中,我把出口从“图书馆丢失”行的下方离开了
  • 不,抱歉……还是不行。它仍然显示为“../program_name.cgi 第 23 行的语法错误,靠近“1123131323fsdfs ...”第 24 行的表达式中不允许出现“no”,即它正在查看程序,并找到未分配给变量的字母,然后退出。然而,如果图书馆存在,它不会摇晃并解码价值!!很奇怪
  • 您将不得不向我们展示更多代码。您的第一个示例甚至不是有效的 Perl,并且在您的第二个示例中分配给 $_ 通常不是标准的。将use warnings;use strict; 放在脚本顶部(如果还没有的话)。
猜你喜欢
  • 2021-02-13
  • 2021-05-05
  • 2016-05-02
  • 2013-12-04
  • 2013-07-27
  • 2022-01-27
  • 1970-01-01
  • 2016-11-12
  • 2014-03-13
相关资源
最近更新 更多