如何获取正在运行的Perl脚本名称

53

如何获取脚本的名称?

例如,我有一个名为XXX.pl的Perl脚本文件,它包含以下内容:

$name = #some function that obtains the script's own name
print $name;

输出:

XXX.pl

我想把这个比作获取脚本目录的CWD函数。我需要一个能够获取脚本名称的函数。

5个回答

88

正在运行的程序名称可以在$0变量中找到:

print $0;

man perlvar 中有关其它特殊变量的信息。


1
有时运行的程序不是pl文件,而是加载并运行pl文件的批处理作业。如果您的文件名与包名相似,则打印“(” . caller . “)”最有用。 - HoldOffHunger

50
use File::Basename;
my $name = basename($0);

附注: getcwd() 以及其他函数 不能提供脚本所在的目录!它们提供的是当前工作目录。如果脚本在你的 PATH 中,并且你仅通过名称而非完整路径调用它,那么 getcwd() 将不能达到你的要求。你需要使用 dirname($0)File::Basename 中也有 dirname 函数)。


1
这是不正确的;dirname($0)也会返回相对路径。如果你使用perl script./script运行脚本,它将返回'.'。 - felwithe

13
你可能也对学习更多关于__FILE__感兴趣,以及可能的__LINE__,它可以给出当前行,我经常一起使用。这两个在perldata中都有提到。
如果你想要这个用于调试目的,你可能还想学习关于warnCarpcaller的内容。

__FILE____LINE__并不需要报告实际可以通过注释更改的值,例如# line 42 foo.pl。请参阅https://perldoc.perl.org/perlsyn#Plain-Old-Comments-%28Not%21%29 - undefined

6

请查看核心Perl发行版中的模块FindBin,它导出您需要查找的变量。

  EXPORTABLE VARIABLES
        $Bin         - path to bin directory from where script was invoked
        $Script      - basename of script from which Perl was invoked
        $RealBin     - $Bin with all links resolved
        $RealScript  - $Script with all links resolved

0
有另一种方法可以从Perl环境哈希%ENV获取信息。由于这是我搜索时找到的唯一有用的页面,我会在这里添加我的方式以供未来的人们参考。 $ENV{'SCRIPT_FILENAME'} 提供正在运行的脚本的完整路径 /var/www/cgi-bin/perlscript.pl $ENV{'SCRIPT_NAME'} 提供chroot路径 /cgi-bin/perlscript.pl 如果您想查看系统提供的所有环境变量,请使用以下代码:
foreach $key (sort(keys(%ENV)))
{
   printf("%16s : %s\n", $key, $ENV{$key});
}

我在检查新环境时经常使用这个循环。
我之所以阅读这个问题,是因为我的工作使用ActiveState Perl,他们没有在环境哈希中提供脚本文件名,所以我试图找到其他方法来获取它。在所有答案中,唯一在我们的环境中起作用的是上面列出的__FILE__

Perl并没有为您提供那种环境。SCRIPT_FILENAME通常由CGI协议提供,所以除非调用您的程序的东西已经为您设置了它,否则您不会看到它。这与Activestate与其他Perl有所不同无关。此外,__FILE__并不需要报告文件的实际名称,因为这可以通过类似# line 42 foo.pl的注释进行更改。请参阅perlsyn - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接