我希望能够在Perl中执行此操作(下面的代码是Python lol)
try:
import Module
except:
print "You need module Module to run this program."
Run Code Online (Sandbox Code Playgroud)
有谁有任何想法如何?
我正在编写一个小的Perl脚本,它依赖于一些可能的模块,因此在安装过程中我必须检查是否每个都有.我可以写use some::module,看看是否出现错误,但是像"你需要安装一些:: module"这样的短消息对于最终用户会更有帮助.
我也可以只搜索每个目录@INC,但是因为它是Perl,所以必须有一个更简单的方法.
我编写了一个Perl脚本,我只是想把它给每个人,因为我计划编写一个bash脚本,用于测试用户的环境并查找该环境是否能够运行Perl脚本.
我想测试一下这样的事情:
任何建议都会非常感激:-)
我正在查看一些代码,但我不明白以下行正在进行/检查:
return if !%Foo::Details:: ;
Run Code Online (Sandbox Code Playgroud)
这究竟是做什么的?它是否检查模块Foo :: Details的存在?
有一句话perlmodlib(1):
可能并非您的系统上安装了下面列出的所有模块.例如,如果您没有gdbm库,则不会安装GDBM_File模块.
如何获得系统中安装的标准模块的实际列表?
我想检测用户何时缺少必需的模块并打印友好的错误消息,说明他们需要安装什么.
到目前为止,我尝试将其放在脚本的开头:
eval {
use IO::Uncompress::Gunzip qw(gunzip $GunzipError) ;
};
if ($@) {
die "Error: IO::Uncompress::Gunzip not installed: $@";
}
Run Code Online (Sandbox Code Playgroud)
但Perl似乎死在"使用"行而不是"死"行,并且从不打印我的错误消息.
根据perldoc -f die, 哪些文件$SIG{__DIE__}
尽管此功能只能在您的程序退出之前运行,但目前并非如此:
$SIG{__DIE__}当前甚至在 evaled 块/字符串中也调用了钩子!如果希望钩子在这种情况下什么都不做,请将其die @_ if $^S;作为处理程序的第一行(参见$^Sperlvar)。因为这会促进远距离奇怪的动作,所以这种违反直觉的行为可能会在未来的版本中得到修复。
所以让我们采用一个基本的信号处理程序,它将触发eval { die 42 },
package Stupid::Insanity {
BEGIN { $SIG{__DIE__} = sub { print STDERR "ERROR"; exit; }; }
}
Run Code Online (Sandbox Code Playgroud)
我们使这安全
package Stupid::Insanity {
BEGIN { $SIG{__DIE__} = sub { return if $^S; print STDERR "ERROR"; exit; }; }
}
Run Code Online (Sandbox Code Playgroud)
现在这不会用触发eval { die 42 },但是当相同的代码位于BEGIN {}像这样的块中时它会触发
BEGIN { eval { die 42 …Run Code Online (Sandbox Code Playgroud) 我正在使用Data :: Dumper和Data :: Dumper :: Simple(DD和DDS)以详细的脚本模式打印哈希,我希望能够与可能没有安装这些模块的其他人共享它所以我正在检查它们是否装满了.
在没有检查模块成功加载的情况下,我将如何加载和使用它们的MWE是:
use strict;
use warnings;
use Data::Dumper;
use Data::Dumper::Simple;
$Data::Dumper::Sortkeys = 1;
my %testHash=();
warn Dumper(\%testHash);
Run Code Online (Sandbox Code Playgroud)
哪个印刷品:
$testHash = {};
Run Code Online (Sandbox Code Playgroud)
使用此处描述的方法首先检查模块是否已加载,如果它们只使用Dumper方法,我将我的代码重写为:
use strict;
use warnings;
my $dumperLoaded = 1;
my $rc;
$rc = eval
{
require Data::Dumper;
Data::Dumper->import();
1;
};
if(!$rc)
{
print "Data::Dumper not found\n";
$dumperLoaded = 0;
}
$rc = eval
{
require Data::Dumper::Simple;
Data::Dumper::Simple->import();
1;
};
if(!$rc)
{
print "Data::Dumper::Simple not found\n";
$dumperLoaded = 0;
}
if($dumperLoaded){
$Data::Dumper::Sortkeys …Run Code Online (Sandbox Code Playgroud) 可能重复:
如何在使用之前检查我是否有Perl模块?
我想评估一个类似于这样的use语句:eval {use $ foo;}但是我遇到了正确的语法问题.我尝试了各种字符串插值组合,但即使对于不存在的模块,eval也会成功.有人可以帮我把这个吗?
perl ×9
module ×3
eval ×2
perl-module ×2
bash ×1
carp ×1
data-dumper ×1
die ×1
import ×1
signals ×1