我有以下Perl代码,它依赖于Term::ReadKey获取终端宽度; 我的NetBSD版本缺少此模块,因此我希望在模块丢失时将终端的宽度默认为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);
Run Code Online (Sandbox Code Playgroud)
我在NetBSD上使用Perl 5.8.7,在CygWin上使用5.8.8你能帮我更有效地将它实现到我的脚本中吗?
Joh*_*usa 92
这是一个简单的解决方案,不需要另一个模块:
my $rc = eval
{
require Term::ReadKey;
Term::ReadKey->import();
1;
};
if($rc)
{
# Term::ReadKey loaded and imported successfully
...
}
Run Code Online (Sandbox Code Playgroud)
请注意,下面的所有答案(我希望它们低于这一个!:-)使用eval { use SomeModule }是错误的,因为use语句在编译时进行评估,无论它们出现在代码中的哪个位置.因此,如果SomeModule不可用,脚本将在编译时立即死亡.
(use语句的字符串eval 也可以工作(eval 'use SomeModule';),但是当require/ importpair执行相同的操作时,在运行时解析和编译新代码是没有意义的,并且在编译时进行语法检查以进行引导.)
最后,请注意我对此示例的使用eval { ... }和$@简洁.在实际代码中,您应该使用类似Try :: Tiny的东西,或至少知道它解决的问题.
m0j*_*0j0 11
查看CPAN模块Module :: Load :: Conditional.它会做你想要的.
经典的答案(可以追溯到Perl 4,至少在有'使用'之前很久)是'require()'一个模块.这是在脚本运行时执行的,而不是在编译时执行,您可以测试成功或失败并做出适当的反应.
小智 7
if (eval {require Term::ReadKey;1;} ne 1) {
# if module can't load
} else {
Term::ReadKey->import();
}
Run Code Online (Sandbox Code Playgroud)
或者
if (eval {require Term::ReadKey;1;}) {
#module loaded
Term::ReadKey->import();
}
Run Code Online (Sandbox Code Playgroud)
注意:1;只有正确加载后才会执行require Term::...。
如果您需要该模块的特定版本:
my $GOT_READKEY;
BEGIN {
eval {
require Term::ReadKey;
Term::ReadKey->import();
$GOT_READKEY = 1 if $Term::ReadKey::VERSION >= 2.30;
};
}
# elsewhere in the code
if ($GOT_READKEY) {
# ...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
29301 次 |
| 最近记录: |