Perl模块内子函数如何自动获取当前正在运行的主脚本文件名?
Perl模块自动获取主脚本文件名的解决方法
核心逻辑
Perl内置全局特殊变量$0默认存储当前执行的主脚本路径,无需从外部传参即可在模块内直接访问。
你之前代码中使用的__FILE__是Perl字面量,返回的是当前所在代码文件的路径,所以在mwe.pm模块内调用时返回的是模块本身的路径,不符合需求。
另外你之前直接拼接getcwd()和文件路径的写法会出现重复路径、多余斜杠的问题,如果需要统一获取主脚本的绝对路径,直接用Cwd模块的abs_path()方法处理$0即可。
修改后的mwe模块代码
use strict; use warnings; use feature 'say'; package mwe; use Cwd qw(abs_path); use Exporter qw(import); # 建议用EXPORT_OK显式导出,避免污染调用方的命名空间 our @EXPORT_OK = qw(tmp); sub tmp { # 直接获取主脚本的绝对路径 my $main_script_path = abs_path($0); say 'written by ' . $main_script_path; } 1;
调用效果
主脚本的use mwe 'tmp';属于显式导入,不需要修改,运行后输出如下:
con@V:~/Scripts$ perl mwe.pl written by /home/con/Scripts/mwe.pl
最小示例优化建议
- 模块开头建议加上
use strict; use warnings;,和主脚本保持一致,提前捕获语法问题 - 除非确定要默认导出所有子函数,否则优先用
@EXPORT_OK,要求调用方显式声明要导入的函数,减少命名冲突概率
内容的提问来源于stack exchange,提问作者con
相关产品推荐
相关产品推荐

