用于执行当前 Perl 副本的名称,来自 C 的 argv[0]
或(在支持的情况下)/proc/self/exe。
根据主机操作系统,$^X
的值可能是 Perl 程序文件的相对或绝对路径名,也可能是用于调用 Perl 的字符串,但不是 Perl 程序文件的路径名。此外,大多数操作系统允许调用不在 PATH 环境变量中的程序,因此不能保证 $^X
的值在 PATH 中。对于 VMS,该值可能包含或不包含版本号。
通常可以使用 $^X
的值重新调用当前正在运行的相同 Perl 的独立副本,例如:
@first_run = `$^X -le "print int rand 100 for 1..100"`;
但请记住,并非所有操作系统都支持分叉或捕获命令的输出,因此此复杂语句可能不可移植。
将$^X
的值用作文件路径名是不安全的,因为某些操作系统对可执行文件有强制后缀,但在调用命令时并不需要使用该后缀。要将$^X
的值转换为路径名,请使用以下语句
# Build up a set of file names (not command names).
use Config;
my $this_perl = $^X;
if ($^O ne 'VMS') {
$this_perl .= $Config{_exe}
unless $this_perl =~ m/$Config{_exe}$/i;
}
由于许多操作系统允许任何拥有 Perl 程序文件读取权限的人复制该文件,修补该副本,然后执行该副本,因此注重安全的 Perl 程序员应该注意调用安装的 perl 副本,而不是$^X
引用的副本。以下语句可以实现此目标,并生成一个可以作为命令调用或作为文件引用的路径名。
use Config;
my $secure_perl_path = $Config{perlpath};
if ($^O ne 'VMS') {
$secure_perl_path .= $Config{_exe}
unless $secure_perl_path =~ m/$Config{_exe}$/i;
}