从命令行调用Perl模块中的函数报错,该如何解决?
问题原因
你用-MFoo::get_string是错误用法:Perl的-M参数用来加载整个模块,它会把Foo::get_string当成独立模块名,因此去寻找Foo/get_string.pm文件,但你的模块实际是Foo.pm,自然找不到,就报了找不到模块的错误。
解决方法
提供几种可行方案,按需选择:
方案1:命令行加载模块后直接调用函数
不需要修改模块,用-e参数执行调用函数的代码:
perl -I. -MFoo -e 'print Foo::get_string(), "\n"'
-MFoo正确加载当前目录下的Foo.pm模块-e后接要执行的Perl代码,直接通过Foo::get_string()调用模块内函数
方案2:修改模块,支持直接命令行运行
在Foo.pm末尾添加代码,让模块被直接执行时自动调用函数:
修改后的Foo.pm:
use strict; use warnings; package Foo; sub get_string { return "foo+bar"; } # 当模块被直接执行(而非被use导入)时,调用函数并打印结果 if (!caller()) { print get_string(), "\n"; } 1; # Perl模块必须以1结尾,确保加载成功
直接在命令行运行模块文件即可:
perl -I. Foo.pm
这种方式不影响脚本里use Foo;调用函数的逻辑。
方案3:用Exporter导出函数,命令行直接调用
如果希望命令行不用写模块前缀就能调用函数,给模块加上导出功能:
修改后的Foo.pm:
use strict; use warnings; package Foo; use Exporter qw(import); # 定义允许导出的函数列表 our @EXPORT_OK = qw(get_string); sub get_string { return "foo+bar"; } 1;
命令行用-MFoo=get_string导入指定函数,再执行调用:
perl -I. -MFoo=get_string -e 'print get_string(), "\n"'
内容的提问来源于stack exchange,提问作者Jim
相关产品推荐
相关产品推荐

