Env::Modulecmd
可以满足你的需求。从文档中可以得知:
示例用法:
Env::Modulecmd
提供了一个自动化接口,可用于从 Perl 中访问modulecmd
。最直接的使用方式是在编译时加载和卸载模块,尽管还提供了许多其他用途。
use Env::Modulecmd { load => 'foo/1.0' };
或者,为了使其更像环境模块shell而不是perl名称空间,您可以像其他shell一样source Environment Modules初始化perl代码:
do( '/usr/share/Modules/init/perl');
module('load use.own');
print module('list');
一个简单的例子:
perl -e "do ('/usr/share/Modules/init/perl');print module('list');"
这个问题是关于"source perl environment module"的,但这些词太过通用,几乎无法搜索到相关信息。
system("load module foo ; foo bar");
或者,如果那行不通,那么
system("load module foo\nfoo bar");
我猜它会改变环境变量。要更改Perl的环境变量,必须在Perl进程内执行。这不会起作用,因为它肯定只设计用于集成到shell中。(不过移植应该不太难。)
如果加载模块后重新启动脚本是可以接受的,您可以使用以下解决方法:
use String::ShellQuote qw( shell_quote );
BEGIN {
if (!@ARGV || $ARGV[0] ne '!!foo_loaded!!') {
my $perl_cmd = shell_quote($^X, '--', $0, '!!foo_loaded!!', @ARGV);
exec("load module foo ; $perl_cmd")
or die $!;
}
shift(@ARGV);
}