【问题标题】:How to specify in the script to only use a specific version of perl?如何在脚本中指定只使用特定版本的 perl?
【发布时间】:2012-07-08 21:49:14
【问题描述】:

我有一个为 5.6.1 版编写的 perl 脚本,它依赖于 Oracle 包、DBI 包等。一切都已正确安装并且可以正常工作。

最近安装了 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?

【问题讨论】:

  • 如果我误解了你,我很抱歉,但你不能在脚本的#! 行中指定你需要的 perl 路径吗?比如#!/program/perl_v5.6.1/bin/perl
  • 我认为他忘记了 shebang 行中的 shebang。
  • @raina77ow Sinan 是对的,我的脚本中有 '#!/program/perl_v5.6.1/bin/perl'。但它仍然把我带到最新的 perl 安装(perl -version)
  • Erm... 你是以perl script.pl 执行脚本还是以./script.pl 执行脚本?抱歉,如果这听起来很愚蠢(可能确实如此),只需检查一下。 )
  • @raina77ow 你是救生员!我试图将我的脚本作为“perl scriptName.pl”运行,它试图使用最新的 perl 安装运行脚本(这实际上是我的愚蠢错误)。所以,我必须指定整个 perl 安装路径并将脚本运行为 '/program/perl_v5.6.1/bin/perl scriptName.pl' 现在当你建议将它运行为 './scriptName.pl' 它给了我权限被拒绝因此,我尝试将脚本作为“scriptName.pl”运行。像魅力一样工作,拿起指定的 perl 版本 5.6.1 并完成工作。非常感谢!

标签: perl


【解决方案1】:

问题是如果 perl 脚本被这样调用,那么在 shebang 行 (#!/some/path/to/perl) 中指定的解释器不会被使用:

perl some_script.pl

... 然后选择 perl 作为“默认”(为了简化)。应该通过执行文件本身来使用 shebang 的原始功能:

./some_script.pl

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

【讨论】:

  • shebang 并没有真正被忽视。如果您已经指定了解释器,它只是不使用 shebang 行中的解释器。
  • 所以如果那里给出了选项,它们仍然会被使用吗?其实不知道,更新了答案。
【解决方案2】:

我的代码中有:

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;
}

它们实际上是两个不同的模块,但这是基本思想。我只是在我的脚本顶部“使用正确级别”而不是use 5.10.1;,如果开发人员尝试为该产品使用错误级别的 perl,我会得到这个死。但是,它不会做任何 use 5.10.1; 会做的事情(启用严格,启用诸如 say、switch 等功能)。

【讨论】:

  • 感谢 Tanktalus。问题是我将脚本作为“perl scriptName.pl”运行,所以它把我带到了最新的 perl 安装。现在将脚本作为“scriptName.pl”运行,它会将我带到“shebang”和“use”命令中提到的 perl 版本。
  • 明智的做法是把整个东西放在一个BEGIN{} 块中,这样它在编译时就会快速失败。否则,它将在失败之前首先执行其所有 use() 语句(和其他编译时指令)。
  • 实际上,Ken,因为这是在它自己的模块中(我讨厌剪切和粘贴,无论如何把它放在一个模块中更有意义),它已经隐含在 BEGIN 中,只要我 @987654326 @ 模块而不是 require。如果我require 它,没有BEGIN 块会有所帮助。我还将我的use correctlevel; 行放在相关脚本的顶部附近。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-14
  • 2012-03-19
  • 1970-01-01
  • 1970-01-01
  • 2010-11-16
  • 2012-06-25
  • 2011-06-13
相关资源
最近更新 更多