【问题标题】:How do i use -M flag to load a perl module using its relative path from command line?如何使用 -M 标志从命令行使用其相对路径加载 perl 模块?
【发布时间】:2019-01-20 03:01:38
【问题描述】:

我有以下代码: 演示.pm

#! user/local/bin/perl
use strict;
use warnings;
package demo;
sub doit{
  print("Inside DoIt\n");
  my $a = shift();
  my $b = shift();
  print("$a\n");
}

文件 demo.pm 位于别处,想使用相对路径来获取模块并运行它

使用 linux 命令中的以下命令会引发错误: perl -M/sub1/sub2/demo.pm -e 'demo::doit('arg1')'

错误:
-e 第 0 行的语法错误,靠近“使用 /sub1/” -e 的执行由于编译错误而中止。

【问题讨论】:

  • 尝试使用-I /path/to/directory/ contains/lib
  • 提示:#! 在模块中没有意义。
  • 提示:模块必须以真值结尾。这通常通过在末尾添加1; 来实现。
  • 提示:如果将use strict; use warnings; 放在package 指令之后,效果会更好。
  • 感谢所有建议,会记住的!

标签: perl unix


【解决方案1】:

如果您有绝对路径并且希望所有脚本都找到该模块:

export PERL5LIB="${PERL5LIB:+"$PERL5LIB:"}/path/to/lib"  # In your login script.
script

如果你有一个绝对路径并且你想要一个脚本的执行来找到模块​​:

PERL5LIB="${PERL5LIB:+"$PERL5LIB:"}/path/to/lib" script

如果您的模块安装在与脚本相关的目录中:

use FindBin qw( $RealBin );
use lib "$RealBin/../lib";

在您的具体情况下:

perl -Mlib=/sub1/sub2 -Mdemo -e'demo::doit("arg1")'

避免使用-I。它不包括像 PERL5LIB 和 lib.pm 这样的相关架构目录,因此具有架构特定组件的模块将无法加载。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-28
    • 2020-09-27
    • 2011-07-30
    • 2018-02-26
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    相关资源
    最近更新 更多