如何确保我的程序在不同平台上找到perl解释器?

时间:2009-11-02 12:35:35

标签: perl

我的Perl脚本在几个操作系统下运行,包括unix和Win32。在每个操作系统上都有唯一的Perl设置,其中perl解释器位于不同的目录下。

有没有办法在shebang线上指定解释器,如:

#!which perl

5 个答案:

答案 0 :(得分:6)

使用常规CPAN工具安装脚本。在构建期间,它们使用您用于运行构建脚本的perl并将其插入到shebang行中。此外,您将确保您使用的perl已安装依赖项。

例如,您位于脚本的顶部:

#!perl

使用常规模块分发流程(请参阅我的App::PPI::Dumper作为示例),

$ perl5.10.0 Makefile.PL

安装它,ExtUtils::MakemakerModule::Build使用您在构建脚本中使用的perl路径重写shebang:

 #!/usr/local/perls/perl-5.10.0-rc2/bin/perl

 eval 'exec /usr/local/perls/perl-5.10.0-rc2/bin/perl  -S $0 ${1+"$@"}'
     if 0; # not running under some shell

当您将脚本作为完整发行版分发时,您可以免费获得所有工具链功能,例如自动安装依赖项。它让生活更轻松。

答案 1 :(得分:3)

在某些unix上(可能是像Cygwin和MinGW / Msys这样)你可以使用env在PATH上搜索perl,如下所示:

#!/usr/bin/env perl

答案 2 :(得分:2)

使用的一个技巧是拥有一行

 #!/usr/bin/env perl

无论位于何处,都会为您运行Perl。

但是...... 你应该注意,如果系统上有多个Perl解释器,这可能会导致问题。例如,我使用Ubuntu linux和Perl是系统的一个组件。但由于Debian人员做出了一些可疑的设置决定,Ubuntu系统Perl解释器的状态不佳,所以安装像CPAN模块这样的东西很棘手。因此,我总是在我的用户空间中使用自己编译的perl来完成自己的工作。一些Ubuntu Perl脚本使用上面的形式,因此如果我碰巧从命令行运行它们就会中断,因为我的perl解释器在Ubuntu默认Perl的路径中领先。

答案 3 :(得分:1)

man perlrun命令为这个问题提供了一些答案,但没有一个是完全可移植的。

答案 4 :(得分:0)

这在http://www.perlmonks.org/index.pl?node_id=118460

进行了讨论

简而言之,无论你做什么,你最终都会在某个时刻假设一个二进制路径,如果/usr/bin/perl不起作用,那么Perl就会被错误配置。

(Windows并不关心shebang系列)