從 C 的 argv[0]
或(在支援的情況下)/proc/self/exe 執行 Perl 目前副本的名稱。
$^X
的值可能取決於主機作業系統,可能是 Perl 程式檔案的相對或絕對路徑名稱,或可能是用於呼叫 Perl 的字串,但不是 Perl 程式檔案的路徑名稱。此外,大多數作業系統允許呼叫不在 PATH 環境變數中的程式,因此無法保證 $^X
的值在 PATH 中。對於 VMS,該值可能包含或不包含版本號碼。
您通常可以使用 $^X
的值重新呼叫目前正在執行的相同 Perl 的獨立副本,例如:
@first_run = `$^X -le "print int rand 100 for 1..100"`;
但請記住,並非所有作業系統都支援命令的 fork 或擷取輸出,因此此複雜陳述可能無法移植。
將 $^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;
}