2012-07-08 83 views
9

我有一个为5.6.1版本编写的perl脚本,它依赖于Oracle包,DBI包和更多东西。一切正确安装和工作。如何在脚本中指定仅使用特定版本的perl?

最近安装了perl 5.8.4版本,并且因为这些依赖关系没有正确设置,所以脚本失败。

'Perl的命令指向/program/perl_v5.8.4/bin/perl - 最新版本

所以,当我要运行我的perl脚本我在命令提示符来手动指定

/program/perl_v5.6.1/bin/perl scriptName.pl 

我试着在脚本中添加以下行:

/program/perl_v5.6.1/bin/perl 
use v5.6.1; 

但是,这意味着脚本必须采取Perl版本> 5.6.1

我找到了几条相关的问题,建议:

  1. 要导出路径。但是,我希望所有用户的脚本无需导出路径
  2. 指定大于。的版本。但是,我只想为该脚本使用一个特定版本。
  3. 使用/需要命令。与上面相同的问题。

我的问题:如何在脚本中指定只使用特定版本的perl?

+1

如果我误解了你的话,我很抱歉,但是你能不能在脚本的'#!'行中指定你需要的perl路径?例如,像'#!/ program/perl_v5.6.1/bin/perl'一样。 – raina77ow 2012-07-08 22:01:41

+0

我觉得他忘记了shebang线的shebang。 – 2012-07-08 22:21:56

+0

@ raina77ow思南是正确的我在我的脚本中有'#!/ program/perl_v5.6.1/bin/perl'。但它仍然带我到最新的perl安装(perl -version) – JoshMachine 2012-07-08 22:45:22

回答

8

的问题是,在家当线(#!/some/path/to/perl)指定的解释不使用,如果perl脚本被称为像这样:

perl some_script.pl

...为“默认”(简化)然后选择perl。应该使用认领的原始功率代替,通过执行该文件本身:

./some_script.pl

当然,这意味着该文件应可执行文件(与chmod a+x,例如)。

+2

shebang没有被真正忽略。如果你已经指定了它,它就不会使用shebang行的解释器。 – 2012-07-09 03:14:08

+0

因此,如果有选择,他们仍然会被使用?实际上并不知道,更新了答案。 – raina77ow 2012-07-09 06:55:59

4

我有我的代码:

our $LEVEL = '5.10.1'; 
our $BRACKETLEVEL = sprintf "%d.%03d%03d", split/\./, $LEVEL; 

if ($] != $currentperl::BRACKETLEVEL) 
{ 
    die sprintf "Must use perl %s, this is %vd!\n", $LEVEL, $^V; 
} 

这实际上是两个不同的模块,但是这是基本的想法。我只是在我的脚本顶部使用“correctlevel”而不是use 5.10.1;,如果开发人员尝试使用该产品的perl级别错误,我会得到这个结果。但是,它不会执行任何其他操作(启用严格的功能,启用说话,开关等功能)。

+0

谢谢Tanktalus。问题是我以'perl scriptName.pl'的身份运行脚本,因此它将我带到最新的perl安装。现在将该脚本作为'scriptName.pl'运行,并使用我在'shebang'和'use'命令中提到的perl版本。 – JoshMachine 2012-07-08 23:13:19

+0

把整个东西放在'BEGIN {}'块中是很明智的,这样在编译时它会很快失败。否则,它会在失败之前首先执行所有的use()语句(以及其他编译时指令)。 – 2012-07-16 14:04:07

+0

事实上,肯,因为这是在它自己的模块(我讨厌剪切和粘贴,无论如何把它放在一个模块中更有意义),它已经隐含在BEGIN中,只要我使用模块而不是'require '。如果我'需要',那么'BEGIN'块不会起作用。我还把我的'使用correctlevel;'行放在相关脚本的顶部附近。 – Tanktalus 2012-07-16 17:56:28

相关问题