加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

如何在使用之前检查我是否有Perl模块?

发布时间:2020-12-15 21:26:42 所属栏目:大数据 来源:网络整理
导读:我有以下Perl代码,它依赖于Term :: ReadKey来获取终端宽度;我的NetBSD build缺少这个模块,所以我想默认的终端的宽度为80时,当模块丢失。 我不知道如何有条件地使用模块,提前知道它是否可用。我当前的实现只是退出与一条消息说,如果它不存在,它找不到Te
我有以下Perl代码,它依赖于Term :: ReadKey来获取终端宽度;我的NetBSD build缺少这个模块,所以我想默认的终端的宽度为80时,当模块丢失。

我不知道如何有条件地使用模块,提前知道它是否可用。我当前的实现只是退出与一条消息说,如果它不存在,它找不到Term :: ReadKey。

#/usr/pkg/bin/perl -w
# Try loading Term::ReadKey
use Term::ReadKey;
my ($wchar,$hchar,$wpixels,$hpixels) = GetTerminalSize();
my @p=(2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97);
my $plen=$#p+1;
printf("num |".("%".int(($wchar-5)/$plen)."d") x $plen."n",@p);

我在NetBSD上使用Perl 5.8.7,在CygWin上使用5.8.8
你能帮我更有效地实现我的脚本吗?

解决方法

这里是一个裸机的解决方案,不需要另一个模块:
my $rc = eval
{
  require Term::ReadKey;
  Term::ReadKey->import();
  1;
};

if($rc)
{
  # Term::ReadKey loaded and imported successfully
  ...
}

注意下面的所有答案(我希望他们在这一个!:-)使用eval {use SomeModule}是错误的,因为use语句在编译时评估,无论它们在代码中出现在哪里。因此,如果SomeModule不可用,脚本将在编译时立即死亡。

(一个使用语句的字符串eval也将工作(eval’use SomeModule’;),但是当require / import对做同样的事情时,在运行时没有意义的解析和编译新代码,并且在编译时进行语法检查引导)。

最后,请注意,我使用eval {…}和$ @这里是简洁的这个例子的目的。在实际代码中,您应该使用类似于Try::Tiny或至少be aware of the issues it addresses。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读