【问题标题】:calling perl subroutine in shell script在 shell 脚本中调用 perl 子例程
【发布时间】:2010-12-07 13:36:15
【问题描述】:

我创建了一个 Perl 模块 MyModule.pm 它有一些子程序 getText 我想在 shell 脚本中调用它们。 我尝试了以下方式,但它给出了错误;

SEC_DIR=`perl -MMyModule -e 'getText'`; # line 1
echo $SEC_DIR
exit 0

返回错误;

Can't locate MyModule.pm in @INC (@INC contains: /usr/lib/perl5/5.10.0/x86_64-linux-thread-multi /usr/lib/perl5/5.10.0 /usr/lib/perl5/site_perl/5.10.0/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.10.0 /usr/lib/perl5/vendor_perl/5.10.0/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl/5.10.0 /usr/lib/perl5/vendor_perl .).

BEGIN 失败--编译中止。

PS:.pm 文件和 .sh 位于同一位置。 我尝试了其他一些选项;

第 1 行:

SEC_DIR=`perl -MMyModule -e '&getText'`;
SEC_DIR=`perl -MMyModule -e 'use MyModule; getText'`;
SEC_DIR=`perl -e 'use MyModule; getText'`;

【问题讨论】:

    标签: perl shell perl-module


    【解决方案1】:

    如果不知道MyModule.pm 中的内容,很难说出了什么问题。

    @INC 看起来没问题(. 在列表中,所以在当前目录中定位 MyModule.pm 应该没有问题。

    这是一个按照您描述的方式工作的最小示例。希望对您有所帮助。

    $ cat SomeModule.pm 
    package SomeModule;
    
    sub testsub
    {
      return "it works\n";
    }
    
    1;
    $ VAL=`perl -I. -MSomeModule -e 'print SomeModule::testsub'`
    $ echo $VAL
    it works
    

    另一种加载模块的方法是:

    $ perl -e 'require "./SomeModule.pm"; print SomeModule::testsub()'
    it works
    

    【讨论】:

    • 感谢您的回复,但是当我使用带有“。”的代码时在“我”之后,它显示相同的错误,但是当我删除“。”时它没有任何回应。 getText 子例程正在返回文件路径。
    • 我已经在普通的 Ubuntu 10.10 和 perl 5.10.1 上对其进行了测试。用“-I”。当前目录只是在任何其他目录之前搜索模块。
    • TIMTOWTDI: perl -e 'do "./MyModule.pm"; getText'
    猜你喜欢
    • 2015-07-30
    • 1970-01-01
    • 2014-06-05
    • 2023-03-13
    • 1970-01-01
    • 2015-05-11
    • 2022-01-04
    • 2015-02-25
    • 1970-01-01
    相关资源
    最近更新 更多