perlrun - 如何執行 Perl 直譯器
perl [ -gsTtuUWX ] [ -h?v ] [ -V[:configvar] ] [ -cw ] [ -d[t][:debugger] ] [ -D[number/list] ] [ -pna ] [ -Fpattern ] [ -l[octal] ] [ -0[octal/hexadecimal] ] [ -Idir ] [ -m[-]module ] [ -M[-]'module...' ] [ -f ] [ -C [number/list] ] [ -S ] [ -x[dir] ] [ -i[extension] ] [ [-e|-E] 'command' ] [ -- ] [ programfile ] [ argument ]...
執行 Perl 程式的正常方式是將其直接設置為可執行,或者將源文件的名稱作為命令行參數傳遞。 (也可以使用交互式 Perl 環境--有關如何執行的詳細信息,請參見 perldebug。) 在啟動時,Perl 會在以下地方之一尋找您的程序
包含在命令行上第一個檔案名稱指定的文件中。(請注意,支援#!
標記的系統會以此方式調用解釋器。請參閱"Perl的位置"。)
隱含通過標準輸入傳入。只有當沒有檔案名稱參數時才有效--要將參數傳遞給一個STDIN讀取程序,您必須明確指定一個“-”作為程序名稱。
使用方法2和3時,Perl從開始解析輸入文件,除非您已經指定了一個"-x"開關,此時它會掃描第一行以#!
開頭並包含單詞“perl”的行,然後從那裡開始。這對於運行嵌入在較大消息中的程序很有用。(在這種情況下,您將使用__END__
標記指示程序的結尾。)
當解析該行時,#!
行始終會被檢查是否有開關。因此,如果您在一台只允許#!
行具有一個參數的機器上,或者更糟的是,甚至不認識#!
行的機器上,您仍然可以獲得一致的開關行為,無論Perl是如何被調用的,即使使用"-x"找到程序的開始。
由於歷史上一些操作系統在32個字符後默默地截斷了對#!
行的內核解釋,一些開關可能會在命令行上傳遞,一些可能不會;如果不小心的話,甚至可能會得到一個沒有字母的“-”。您可能希望確保所有開關都在那個32個字符的邊界之前或之後。大多數開關實際上並不在乎它們是否被多次處理,但是得到一個“-”而不是完整的開關可能會導致Perl嘗試執行標準輸入而不是您的程序。而且部分的-I開關也可能導致奇怪的結果。
一些開關會在處理兩次時有所不同,例如-l和-0的組合。要麼將所有開關放在32個字符邊界之後(如果適用),要麼將-0digits的使用替換為BEGIN{ $/ = "\0digits"; }
。
#!
開關的解析從提到"perl"的地方開始。序列"-*"和"- "明確被忽略,以便您可以(如果您有興趣的話)說
#!/bin/sh
#! -*- perl -*- -p
eval 'exec perl -x -wS $0 ${1+"$@"}'
if 0;
讓Perl看到"-p"開關。
一個類似的技巧涉及env程序,如果您有的話。
#!/usr/bin/env perl
上面的例子使用了相對路徑到perl解釋器,獲取用戶路徑中的第一個版本。如果您想要特定版本的Perl,比如perl5.14.1,您應該直接將其放在#!
行的路徑中。
如果#!
行中不包含單詞"perl"或單詞"indir",則會執行#!
後面命名的程序,而不是Perl解釋器。這有點奇怪,但它可以幫助那些不執行#!
的機器上的人,因為他們可以告訴一個程序他們的SHELL是/usr/bin/perl,然後Perl將程序分派給正確的解釋器。
在定位程序後,Perl將整個程序編譯為內部形式。如果有任何編譯錯誤,將不會嘗試執行程序。(這與典型的shell腳本不同,後者在發現語法錯誤之前可能會部分運行。)
如果程序在語法上是正確的,則執行它。如果程序在結束時沒有遇到exit()或die()運算符,則提供隱式的exit(0)
以指示成功完成。
Unix的#!
技術可以在其他系統上模擬
將
extproc perl -S -your_switches
作為*.cmd
文件的第一行(由於cmd.exe的`extproc'處理中的錯誤,因此"-S")。
創建一個批處理文件來運行您的程序,並在ALTERNATE_SHEBANG
中編碼它(有關更多信息,請參見源發行版中的dosish.h文件)。
使用 ActiveState 安裝程式安裝 Perl 時,Win95/NT 的安裝會修改註冊表以將 .pl 延伸名與 Perl 解譯器關聯。如果您以其他方式安裝 Perl(包括從來源碼構建),則可能需要自行修改註冊表。請注意,這意味著您不再能夠區分可執行的 Perl 程序和 Perl 庫文件。
將
$ perl -mysw 'f$env("procedure")' 'p1' 'p2' 'p3' 'p4' 'p5' 'p6' 'p7' 'p8' !
$ exit++ + ++$status != 0 and $exit = $status = undef;
在您的程序頂部,其中 -mysw 是您想要傳遞給 Perl 的任何命令行開關。您現在可以直接調用程序,說 perl program
,或者作為 DCL 程序,說 @program
(或通過僅使用程序名隱含地通過 DCL$PATH)。
這個咒語有點難記,但如果您說 perl "-V:startperl"
,Perl 將為您顯示它。
非 Unix 系統上的命令解釋器對引用的想法有很大不同於 Unix shell。您需要學習您的命令解釋器中的特殊字符(*
、\
和 "
是常見的),以及如何保護空格和這些字符以運行單行命令(參見下面的 -e)。
在某些系統上,您可能需要將單引號更改為雙引號,但這在 Unix 或 Plan 9 系統上絕不能做。您可能還需要將單個 % 更改為 %%。
例如
# Unix
perl -e 'print "Hello world\n"'
# MS-DOS, etc.
perl -e "print \"Hello world\n\""
# VMS
perl -e "print ""Hello world\n"""
問題在於這些都不可靠:它取決於命令,完全有可能兩者都不起作用。如果 4DOS 是命令殼,這可能會更好地運作
perl -e "print <Ctrl-x>"Hello world\n<Ctrl-x>""
CMD.EXE 在 Windows NT 中偷偷加入了許多標準 Unix 功能,但試圖找到其引用規則的文檔。
這沒有通用解決方案。這就是一團混亂。
這似乎是顯而易見的,但只有當用戶能夠輕鬆找到 Perl 時,Perl 才有用。如果可能的話,最好是將 /usr/bin/perl 和 /usr/local/bin/perl 都建立為實際二進制文件的符號鏈接。如果無法這樣做,強烈建議系統管理員將(符號鏈接到)perl 及其相應的工具放入通常在用戶 PATH 中找到的目錄,或者放在其他明顯且方便的地方。
在本文檔中,程序的第一行 #!/usr/bin/perl
將代表在您的系統上適用的任何方法。如果您關心特定版本,建議您使用特定的路徑。
#!/usr/local/bin/perl5.14
或者,如果您只想运行至少版本,可以在程序顶部放置类似以下语句
use v5.14;
与所有标准命令一样,单字符开关可以与后续开关(如果有)合并。
#!/usr/bin/perl -spi.orig # same as -s -p -i.orig
--
表示选项结束,并禁用进一步的选项处理。 --
后的任何参数都被视为文件名和参数。
开关包括
将输入记录分隔符($/
)指定为八进制或十六进制数字。 如果没有数字,则空字符为分隔符。 其他开关可以在数字之前或之后。 例如,如果您有一个可以打印由空字符终止的文件名的版本的 find,您可以这样说
find . -name '*.orig' -print0 | perl -n0e unlink
特殊值00会导致Perl以段落模式吞下文件。
任何值0400或以上都会导致Perl整个地吞下文件,但是按照惯例,值0777是通常用于此目的的值。 "-g"标志是其更简单的别名。
您还可以使用十六进制表示法指定分隔符字符:-0xHHH...,其中H
是有效的十六进制数字。 与八进制形式不同,此形式可以用于指定任何Unicode字符,即使是超出0xFF的字符。 因此,如果您确实希望将记录分隔符设置为0777,请将其指定为-0x1FF。(这意味着您不能使用"-x"选项与由十六进制数字组成的目录名称,否则Perl将认为您已经将十六进制数字指定为-0。)
在使用"-n"或"-p"时,启用自动分割模式。 在由"-n"或"-p"产生的隐式while循环内的第一件事就是对@F数组执行隐式分割命令。
perl -ane 'print pop(@F), "\n";'
等同于
while (<>) {
@F = split(' ');
print pop(@F), "\n";
}
可以使用-F指定替代分隔符。
-a隐式设置了"-n"。
-C标志控制一些Perl Unicode特性。
从5.8.1开始,-C可以后跟数字或选项字母列表。 字母,它们的数值和效果如下; 列出字母相当于对数字求和。
I 1 STDIN is assumed to be in UTF-8
O 2 STDOUT will be in UTF-8
E 4 STDERR will be in UTF-8
S 7 I + O + E
i 8 UTF-8 is the default PerlIO layer for input streams
o 16 UTF-8 is the default PerlIO layer for output streams
D 24 i + o
A 32 the @ARGV elements are expected to be strings encoded
in UTF-8
L 64 normally the "IOEioA" are unconditional, the L makes
them conditional on the locale environment variables
(the LC_ALL, LC_CTYPE, and LANG, in the order of
decreasing precedence) -- if the variables indicate
UTF-8, then the selected "IOEioA" are in effect
a 256 Set ${^UTF8CACHE} to -1, to run the UTF-8 caching
code in debugging mode.
例如,-COE和-C6都将在STDOUT和STDERR上打开UTF-8。 重复字母只是多余的,不是累积的,也不是切换的。
選項 io
意味著在主程式範圍中的任何後續 open()(或類似的 I/O 操作)都會自動應用 :utf8
PerlIO 層,換句話說,任何輸入流都期望 UTF-8,而任何輸出流都產生 UTF-8。這僅是通過 ${^OPEN}
預設設置的,使用 open() 中的顯式層和 binmode() 可以像往常一樣操作流。這對於在模塊中運行的代碼沒有影響。
-C 單獨(不跟隨任何數字或選項列表),或對於 "PERL_UNICODE" 環境變量的空字符串 ""
,具有與 -CSDL 相同的效果。換句話說,標準 I/O 處理程序和默認的 open()
層會使用 UTF-8,但只有當地區環境變量指示為 UTF-8 地區時才會使用。這種行為遵循 Perl 5.8.0 的隱式(且有問題的)UTF-8 行為。(參見 perl581delta 中的 "UTF-8 no longer default under UTF-8 locales"。)
您可以使用 -C0(或對於 PERL_UNICODE
使用 "0"
)來明確禁用上述所有 Unicode 功能。
只讀的魔法變量 ${^UNICODE}
反映了此設置的數值。此變量在 Perl 啟動時設置,此後為只讀。如果您想要運行時效果,請使用三個參數的 open()(參見 perlfunc 中的 "open"),兩個參數的 binmode()(參見 perlfunc 中的 "binmode"),以及 open
命令。
(在早於 5.8.1 的 Perl 版本中,-C 開關是一個僅適用於 Win32 的開關,它啟用了 Unicode 意識的 "寬系統調用" Win32 API 的使用。但是,此功能實際上幾乎沒有使用,因此命令行開關因此被 "重用"。)
注意: 自 perl 5.10.1 起,如果在 #!
行中使用 -C 選項,則必須在命令行中指定,因為在 perl 解釋器執行的此時點上,標準流已經設置完成。您也可以使用 binmode() 來設置 I/O 流的編碼。
使得 Perl 檢查程式的語法,然後退出而不執行它。實際上,它將執行任何 BEGIN
、UNITCHECK
或 CHECK
區塊以及任何 use
語句:這些被視為發生在程式執行之外。然而,INIT
和 END
區塊將被跳過。
以 Perl 偵錯器運行程式。請參閱 perldebug。如果指定了 t,則表示在被偵錯的程式中將使用執行緒。
以安裝為 Devel::MOD
的偵錯、分析或追蹤模組的控制運行程式。例如,-d:DProf 使用 Devel::DProf
分析器執行程式。與 -M 旗標一樣,選項可以傳遞給 Devel::MOD
套件,這些選項將由 Devel::MOD::import
程序接收並解釋。再次像 -M 一樣,使用 ---d:-MOD 來呼叫 Devel::MOD::unimport
而不是 import。選項的逗號分隔列表必須跟在一個 =
字符之後。如果指定了 t,則表示在被偵錯的程式中將使用執行緒。請參閱 perldebug。
設置偵錯標誌。此開關僅在您的 perl 可執行文件已啟用偵錯時才可用:正常生產的 perl 可能不會啟用。
例如,要觀察 Perl 如何執行您的程式,請使用 -Dtls。另一個不錯的值是 -Dx,它列出了您編譯的語法樹,-Dr 顯示了編譯的正則表達式;輸出格式在 perldebguts 中有解釋。
作為替代,可以指定一個數字而不是字母列表(例如,-D14 等同於 -Dtls)
1 p Tokenizing and parsing (with v, displays parse
stack)
2 s Stack snapshots (with v, displays all stacks)
4 l Context (loop) stack processing
8 t Trace execution
16 o Method and overloading resolution
32 c String/numeric conversions
64 P Print profiling info, source file input state
128 m Memory and SV allocation
256 f Format processing
512 r Regular expression parsing and execution
1024 x Syntax tree dump
2048 u Tainting checks
4096 U Unofficial, User hacking (reserved for private,
unreleased use)
8192 h Show hash randomization debug output (changes to
PL_hash_rand_bits and their origin)
16384 X Scratchpad allocation
32768 D Cleaning up
65536 S Op slab allocation
131072 T Tokenizing
262144 R Include reference counts of dumped variables
(eg when using -Ds)
524288 J show s,t,P-debug (don't Jump over) on opcodes within
package DB
1048576 v Verbose: use in conjunction with other flags to
increase the verbosity of the output. Is a no-op on
many of the other flags
2097152 C Copy On Write
4194304 A Consistency checks on internal structures
8388608 q quiet - currently only suppresses the "EXECUTING"
message
16777216 M trace smart match resolution
33554432 B dump suBroutine definitions, including special
Blocks like BEGIN
67108864 L trace Locale-related info; what gets output is very
subject to change
134217728 i trace PerlIO layer processing. Set PERLIO_DEBUG to
the filename to trace to.
268435456 y trace y///, tr/// compilation and execution
所有這些標誌在編譯 Perl 可執行文件時都需要 -DDEBUGGING(但請參閱 Devel::Peek 中的 :opd
或 re 中的 "'debug' 模式",這可能會改變這一點)。請參閱 Perl 源分發中的 INSTALL 文件以了解如何執行此操作。
如果您只是想要在每行 Perl 代碼執行時獲得輸出,就像 sh -x
提供的方式用於 shell 腳本一樣,您無法使用 Perl 的 -D 開關。而是這樣做
# If you have "env" utility
env PERLDB_OPTS="NonStop=1 AutoTrace=1 frame=2" perl -dS program
# Bourne shell syntax
$ PERLDB_OPTS="NonStop=1 AutoTrace=1 frame=2" perl -dS program
# csh syntax
% (setenv PERLDB_OPTS "NonStop=1 AutoTrace=1 frame=2"; perl -dS program)
有關詳細信息和變體,請參閱 perldebug。
可用於輸入一行程式碼。若給定 -e,Perl 將不會在參數列表中尋找檔案名稱。可以使用多個 -e 指令來構建多行腳本。請確保在正常程式中使用分號。
停用啟動時執行 $Config{sitelib}/sitecustomize.pl。
Perl 可以建置成默認情況下會在啟動時嘗試執行 $Config{sitelib}/sitecustomize.pl(在 BEGIN 區塊中)。這是一個允許系統管理員自定義 Perl 行為的鉤子。例如,它可以用於向 @INC 陣列添加條目,以使 Perl 在非標準位置找到模組。
Perl 實際上插入以下代碼
BEGIN {
do { local $!; -f "$Config{sitelib}/sitecustomize.pl"; }
&& do "$Config{sitelib}/sitecustomize.pl";
}
由於這是一個實際的 do
(而不是 require
),sitecustomize.pl 不需要返回真值。該代碼在 package main
中運行,在其自己的詞法作用域中。但是,如果腳本死亡,$@
將不被設置。
$Config{sitelib}
的值也是在 C 代碼中確定的,而不是從 Config.pm
讀取,而該模組未加載。
該代碼非常早地執行。例如,對 @INC
所做的任何更改都會顯示在 `perl -V` 的輸出中。當然,END
區塊將同樣非常晚地執行。
在運行時要確定您的 Perl 中是否已編譯了此功能,您可以檢查 $Config{usesitecustomize}
的值。
指定要用於 "-a" 的分隔模式。該模式可以被 //
、""
或 ''
包圍,否則它將被放在單引號中。您不能在模式中使用文字空格或 NUL 字符。
取消定義輸入記錄分隔符($/
),從而啟用 slurp 模式。換句話說,它導致 Perl 一次性讀取整個文件,而不是逐行讀取。
此標誌是 -0777 的簡單別名。
記憶法:gobble, grab, gulp。
打印選項摘要。
同義詞-h:列印選項摘要。
指定由<>
構造處理的文件將被原地編輯。它通過重新命名輸入文件、以原始名稱打開輸出文件,並將該輸出文件選為print()語句的默認值來實現這一點。如果提供了擴展名,則使用該擴展名來修改舊文件的名稱以製作備份副本,遵循以下規則
如果未提供擴展名,並且您的系統支持,則原始文件將保持打開狀態且沒有名稱,而輸出將重定向到具有原始文件名的新文件。當perl退出時,無論是幹凈退出還是不幹凈退出,都將取消鏈接原始文件。
如果擴展名不包含*
,則將其附加到當前文件名的末尾作為後綴。如果擴展名包含一個或多個*
字符,則每個*
都將替換為當前文件名。以Perl術語來說,您可以將其視為
($backup = $extension) =~ s/\*/$file_name/g;
這使您可以將前綴添加到備份文件,而不是(或除了)後綴
$ perl -pi'orig_*' -e 's/bar/baz/' fileA # backup to
# 'orig_fileA'
甚至將原始文件的備份副本放入另一個目錄中(前提是目錄已存在)
$ perl -pi'old/*.orig' -e 's/bar/baz/' fileA # backup to
# 'old/fileA.orig'
這些一行命令集是等效的
$ perl -pi -e 's/bar/baz/' fileA # overwrite current file
$ perl -pi'*' -e 's/bar/baz/' fileA # overwrite current file
$ perl -pi'.orig' -e 's/bar/baz/' fileA # backup to 'fileA.orig'
$ perl -pi'*.orig' -e 's/bar/baz/' fileA # backup to 'fileA.orig'
從shell中說
$ perl -p -i.orig -e "s/foo/bar/; ... "
與使用程序相同
#!/usr/bin/perl -pi.orig
s/foo/bar/;
這相當於
#!/usr/bin/perl
$extension = '.orig';
LINE: while (<>) {
if ($ARGV ne $oldargv) {
if ($extension !~ /\*/) {
$backup = $ARGV . $extension;
}
else {
($backup = $extension) =~ s/\*/$ARGV/g;
}
rename($ARGV, $backup);
open(ARGVOUT, ">$ARGV");
select(ARGVOUT);
$oldargv = $ARGV;
}
s/foo/bar/;
}
continue {
print; # this prints to original filename
}
select(STDOUT);
唯一的區別是,-i形式不需要將$ARGV與$oldargv進行比較以知道文件名何時已更改。但是,它確實使用ARGVOUT選擇文件處理程序。請注意,在循環之後,標準輸出(STDOUT)將恢復為默認的輸出文件處理程序。
如上所示,Perl會創建備份文件,無論是否實際更改了任何輸出。因此,這只是一種複製文件的花式方式
$ perl -p -i'/some/file/path/*' -e 1 file1 file2 file3...
or
$ perl -p -i'.orig' -e 1 file1 file2 file3...
您可以使用無括號的eof
來找到每個輸入文件的末尾,以便在每個文件中添加,或重置行號(參見perlfunc中的"eof"中的示例)。
如果對於給定文件,Perl無法按照擴展名中指定的方式創建備份文件,則它將跳過該文件並繼續下一個(如果存在)。
有關文件權限和-i的問題的討論,請參見perlfaq5中的"Why does Perl let me delete read-only files? Why does -i clobber protected files? Isn't this a bug in Perl?"。
您不能使用 -i 建立目錄或從檔案中剝除擴展名。
Perl 在檔名中不會展開 ~
,這很好,因為有些人會將其用於備份檔案。
$ perl -pi~ -e 's/foo/bar/' file1 file2 file3...
請注意,由於 -i 在建立新檔案之前重新命名或刪除原始檔案,因此不會保留 Unix 風格的軟連結和硬連結。
最後,當命令行未給定任何檔案時,-i 開關不會阻礙執行。在這種情況下,不會進行備份(原始檔案當然無法確定),處理會從 STDIN 到 STDOUT 進行,如預期的那樣。
-I 指定的目錄將被加入到模組的搜尋路徑(@INC
)之前。
啟用自動處理換行符號。它有兩個獨立的效果。首先,當與 "-n" 或 "-p" 一起使用時,它會自動移除 $/
(輸入記錄分隔符號)。其次,它會將 $\
(輸出記錄分隔符號)指定為 octnum 的值,以便於任何 print 陳述都會將該分隔符號重新加回去。如果省略了 octnum,則將 $\
設定為 $/
的當前值。例如,將行修剪為 80 列:
perl -lpe 'substr($_, 80) = ""'
請注意,當處理開關時,分配 $\ = $/
,因此如果 -l 開關後跟著 -0 開關,輸入記錄分隔符號可能與輸出記錄分隔符號不同。
gnufind / -print0 | perl -ln0e 'print "found $_" if -p'
這將 $\
設定為換行符號,然後將 $/
設定為空字符。
-mmodule 在執行您的程序之前執行 use
module ();
。這會加載模組,但不會調用其 import
方法,因此不會導入子程序,也不會生效於 pragma。
-Mmodule 在執行您的程序之前執行 use
module ;
。這會加載模組並調用其 import
方法,從而使模組具有其默認效果,通常是導入子程序或生效於 pragma。您可以使用引號在模組名後添加額外的代碼,例如,'-MMODULE qw(foo bar)'
。
如果在 -M 或 -m 後的第一個字符是破折號(-),則 'use' 會替換為 'no'。對於 -m 這沒有任何影響。
一些內建的語法糖表示您也可以使用 -mMODULE=foo,bar 或 -MMODULE=foo,bar 作為 '-MMODULE qw(foo bar)' 的捷徑。這樣可以避免在導入符號時使用引號。由 -MMODULE=foo,bar 生成的實際代碼是 use module split(/,/,q{foo,bar})
。請注意,=
形式消除了 -m 和 -M 之間的區別;也就是說,-mMODULE=foo,bar 與 -MMODULE=foo,bar 是相同的。
split
公式的結果是,-MMODULE=number 永遠不會進行版本檢查,除非 MODULE::import()
本身設置為進行版本檢查,例如,如果 MODULE 繼承自 Exporter。
導致 Perl 假定以下循環環繞您的程序,使其類似於 sed -n 或 awk 一樣遍歷文件名參數。
LINE:
while (<>) {
... # your program goes here
}
請注意,默認情況下不會打印行。請參閱 "-p" 以打印行。如果由參數指定的文件因某種原因無法打開,Perl 會警告您並繼續處理下一個文件。
還請注意,<>
將命令行參數傳遞給 perlfunc 中的 "open",這不一定將其解釋為文件名。有關可能的安全性問題,請參閱 perlop。
這是一種有效的方法來刪除所有未修改至少一週的文件。
find . -mtime +7 -print | perl -nle unlink
這比使用 find 的 -exec 選項更快,因為您不必對找到的每個文件名啟動一個進程(但不比使用新版本 find 中提供的 -delete 選項更快)。它確實存在一個錯誤,即在路徑名中錯誤處理換行符號,如果您按照 -0 下的示例進行修復,則可以解決此問題。
BEGIN
和 END
塊可用於在隱式程序循環之前或之後捕獲控制,就像 awk 一樣。
導致 Perl 假定以下循環環繞您的程序,使其類似於 sed 一樣遍歷文件名參數。
LINE:
while (<>) {
... # your program goes here
} continue {
print or die "-p destination: $!\n";
}
如果由參數指定的文件因某種原因無法打開,Perl 會警告您並繼續處理下一個文件。請注意,行會自動打印。打印期間發生的錯誤被視為致命的。要抑制打印,請使用 "-n" 選項。 -p 會覆蓋 -n。
BEGIN
和 END
塊可用於在隱式循環之前或之後捕獲控制,就像 awk 一樣。
啟用了在程式名稱之後但在任何檔案名稱參數(或在--參數之前)的命令列上解析開關的基本功能。在那裡找到的任何開關都會從@ARGV中刪除並設置Perl程式中的對應變數,位於主要封包中。以下程式會在使用-xyz開關呼叫程式時輸出"1",並在使用-xyz=abc呼叫時輸出"abc"。
#!/usr/bin/perl -s
if ($xyz) { print "$xyz\n" }
請注意,像--help這樣的開關會建立變數${-help}
,這不符合use strict "refs"
。此外,當在啟用警告的腳本上使用此選項時,您可能會收到許多不必要的"僅使用一次"警告。基於這些原因,不建議使用-s。請參閱Getopt::Long以獲得更靈活的開關解析。
使Perl使用"PATH"環境變數來搜索程式,除非程式名包含路徑分隔符。
在某些平台上,這也使Perl在搜尋文件名時附加後綴。例如,在Win32平台上,如果查找原始名稱失敗且名稱尚未以這些後綴結尾,則會附加".bat"和".cmd"後綴。如果您的Perl是使用DEBUGGING
編譯的,則使用-Dp開關來顯示Perl搜索的進度。
通常這是用來模擬在不支援#!
的平台上的#!
啟動。在除錯使用#!
的腳本時也很方便,因此通常會被shell的$PATH搜索機制找到。
此示例可在具有與Bourne shell兼容的shell的許多平台上運行。
#!/usr/bin/perl
eval 'exec /usr/bin/perl -wS $0 ${1+"$@"}'
if 0; # ^ Run only under a shell
系統會忽略第一行並將程式餵給 /bin/sh,然後該程式會嘗試將 Perl 程式當作 shell 腳本來執行。shell 會將第二行當作普通的 shell 命令執行,從而啟動 Perl 解譯器。在某些系統上,$0 不一定包含完整的路徑名稱,因此 "-S" 告訴 Perl 在必要時搜索該程式。Perl 定位到程式後,會解析這些行並忽略它們,因為檢查 'if 0' 從不為真。如果該程式將被 csh 解譯,您需要用 $*
替換 ${1+"$@"}
,即使它無法理解參數列表中的嵌入式空格等。要啟動 sh 而不是 csh,某些系統可能需要用只包含冒號的行來替換 #!
行,這將被 Perl 禮貌地忽略。其他系統無法控制這一點,需要一個完全狡猾的結構,在任何 csh、sh 或 Perl 下都能工作,例如以下方式
eval '(exit $?0)' && eval 'exec perl -wS $0 ${1+"$@"}'
& eval 'exec /usr/bin/perl -wS $0 $argv:q'
if 0; # ^ Run only under a shell
如果提供的文件名包含目錄分隔符(因此是絕對或相對路徑名),且如果找不到該文件,則附加文件擴展名的平台將逐個添加擴展名並嘗試查找該文件。
在類似 DOS 的平台上,如果程式不包含目錄分隔符,則首先會在當前目錄中搜尋該程式,然後才會在 PATH 中搜尋。在 Unix 平台上,會嚴格按照 PATH 搜索該程式。
與 "-T" 類似,但檢查污點會發出警告而不是致命錯誤。這些警告現在可以通過 no warnings qw(taint)
進行正常控制。
注意:這並不是 -T
的替代品! 這僅用作臨時開發輔助工具,用於保護遺留代碼:對於真正的生產代碼和從頭開始編寫的新安全代碼,請始終使用真正的 "-T"。
如果您的 perl 沒有建立污點支持,則此選項無效。
打開“污點”,以便您可以對其進行測試。通常僅在運行 setuid 或 setgid 時才執行這些檢查。對於運行代表您可能不完全信任的其他人的程序(例如 Perl 中編寫的 CGI 程序或任何互聯網服務器),建議明確打開它們。有關安全原因,此選項必須在 Perl 非常早地看到;通常這意味著它必須在命令行上或對於支持該結構的系統中的 #!
行中早些出現。
這個選項使得 Perl 在編譯您的程序後會導致核心轉儲。理論上,您可以使用未提供的 undump 程序將此核心轉儲文件轉換為可執行文件。這會加快啟動速度,但會增加一些磁盤空間(您可以通過剝離可執行文件來最小化這些空間)。 (在我的機器上,一個 "hello world" 可執行文件大約有 200K。)如果您想在轉儲之前執行程序的某部分,請改用 CORE::dump()
函數。注意:可用性取決於平台,可能對 Perl 的特定端口不可用。
允許 Perl 執行不安全的操作。目前唯一的“不安全”操作是以超級用戶身份運行時嘗試取消連接目錄以及以致命性污點檢查轉換為警告運行 setuid 程序。請注意,必須啟用警告與此選項一起使用,以實際生成污點檢查警告。
打印您的 Perl 可執行文件的版本和補丁級別。
打印主要 Perl 配置值的摘要以及 @INC 的當前值。
將命名配置變量的值打印到 STDOUT,當您的 configvar
參數看起來像正則表達式(包含非字母字符)時,將打印多個值。例如
$ perl -V:libc
libc='/lib/libc-2.2.4.so';
$ perl -V:lib.
libs='-lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc';
libc='/lib/libc-2.2.4.so';
$ perl -V:lib.*
libpth='/usr/local/lib /lib /usr/lib';
libs='-lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc';
lib_ext='.a';
libc='/lib/libc-2.2.4.so';
libperl='libperl.a';
....
此外,可以使用額外的冒號來控制格式。尾部冒號抑制換行符和終止符“;”,允許您將查詢嵌入到 shell 命令中。(記憶法:路徑分隔符“:”)
$ echo "compression-vars: " `perl -V:z.*: ` " are here !"
compression-vars: zcat='' zip='zip' are here !
領先的冒號會刪除回應的“name=”部分,這使您可以映射到所需的名稱。(記憶法:空標籤)
$ echo "goodvfork="`./perl -Ilib -V::usevfork`
goodvfork=false;
如果您需要無名稱的位置參數值,可以一起使用領先和尾部冒號。請注意,在下面的情況下,PERL_API
參數按字母順序返回。
$ echo building_on `perl -V::osname: -V::PERL_API_.*:` now
building_on 'linux' '5' '1' '9' now
打印關於可疑構造的警告,例如僅被提及一次的變量名和在設置之前使用的純量變量;重定義的子程序;對未定義文件句柄的引用;以只讀模式打開的文件句柄,您正在試圖對其進行寫入;用作數字的值,看起來不像數字;將數組用作純量;如果您的子程序遞歸深度超過 100 層;以及其他無數的事情。
此選項實際上只是啟用全局 $^W
變量;通常,優先使用詞法範圍的 use warnings
声明。您可以使用 __WARN__
鉤子禁用或將特定警告提升為致命錯誤,如 perlvar 和 perlfunc 中的 "warn" 所述。另外,如果您想操作整個類別的警告,還提供了一個細粒度的警告設施;參見 warnings。
啟用所有警告,不論是否有 no warnings
或 $^W
。參見 warnings。
停用所有警告,不論是否有 use warnings
或 $^W
。參見 warnings。
在 "PERL5OPT"
中禁用。
告訴 Perl 程式嵌入在一個較大的與程式無關的文本塊中,例如郵件消息中。將丟棄領先的無用內容,直到以 #!
開頭並包含字符串 "perl" 的第一行。該行上的任何有意義的開關將被應用。
程式對行號的所有引用(警告、錯誤等)將把 #!
行視為第一行。因此,程序中第二行的警告,實際在文件中的第 100 行,將被報告為第 2 行,而不是第 100 行。這可以通過使用 #line
指令來覆蓋。 (參見 perlsyn 中的 "Plain Old Comments (Not!)")
如果指定了目錄名稱,Perl 將在運行程序之前切換到該目錄。 -x 開關僅控制領先無用內容的處置。如果存在尾隨無用內容,程序必須以 __END__
終止;程序可以通過 DATA
文件處理所有或部分尾隨無用內容(如果需要)。
如果指定了目錄,則必須在 -x 後面立即出現,中間不能有空格。
如果 chdir
沒有參數時使用。
如果 chdir
沒有參數且未設置 "主目錄" 時使用。
用於執行子進程,以及在使用 "-S" 時尋找程序。
在查找標準庫之前,列出要查找 Perl 函式庫文件的目錄列表。如果存在任何與指定位置下的架構特定和版本特定目錄匹配的目錄,例如 version/archname/、version/ 或 archname/,則在解釋器啟動時會自動包括這些目錄。此外,將添加與 $Config{inc_version_list}
中的項目匹配的任何目錄。(這些通常是在相同目錄樹中安裝的舊版本兼容 perl 版本。)
如果未定義 PERL5LIB,則使用 "PERLLIB"。在 Unixish 平台上,目錄使用冒號分隔(如 PATH),在 Windows 上使用分號分隔(適當的路徑分隔符由命令 perl -V:path_sep
給出)。
執行汙點檢查時,可能因為程式正在以 setuid 或 setgid 模式執行,或者指定了 "-T" 或 "-t" 開關,此時不會查詢 PERL5LIB 或 "PERLLIB"。程式應改為使用
use lib "/my/directory";
命令行選項(開關)。此變數中的開關會被視為在每個 Perl 命令行上。僅允許使用 -[CDIMTUWdmtw] 開關。執行汙點檢查時(可能因為程式正在以 setuid 或 setgid 模式執行,或者使用了 "-T" 或 "-t" 開關),此變數會被忽略。如果 PERL5OPT 以 -T 開頭,則會啟用汙點檢查並忽略後續選項。如果 PERL5OPT 以 -t 開頭,則會啟用汙點檢查,從 @INC 中移除可寫的點,並遵循後續選項。
一個空格(或冒號)分隔的 PerlIO 層級清單。如果 perl 是建立為使用 PerlIO 系統進行 IO(默認),這些層級會影響 Perl 的 IO。
通常將層級名稱以冒號開頭(例如,:perlio
)以強調它們與變量 "屬性" 的相似性。但是解析層級規範字符串的代碼(同時用於解碼 PERLIO 環境變量)將冒號視為分隔符。
未設置或空白的 PERLIO 等效於平台的默認層級集合;例如,在類 Unix 系統上是 :unix:perlio
,在 Windows 和其他 DOS 類似系統上是 :unix:crlf
。
此清單將成為所有 Perl IO 的默認值。因此,此清單中只能包含內建層級,因為外部層級(如 :encoding()
)需要 IO 才能加載它們!參見 "open pragma" 如何將外部編碼添加為默認值。
PERLIO 環境變量中適合包含的層級簡要摘要如下。有關詳細信息,請參閱 PerlIO。
一個層級,對 MS-DOS 和類似操作系統的“文本”和“二進制”文件進行 CRLF 到 "\n"
的轉換,並且在這些架構上提供類似 :perlio
的緩衝。
這是 stdio 類型的緩衝的重新實現,寫成 PerlIO 層級。因此,它將調用其下面的任何層級進行操作,通常是 :unix
。
此層級通過包裝系統的 ANSI C“stdio”庫調用提供 PerlIO 接口。該層級提供緩衝和 IO。請注意,即使是該平台的正常行為,:stdio
層級也不執行 CRLF 轉換。您將需要在其上添加一個 :crlf
層級來執行此操作。
調用read
、write
、lseek
等低階層級的層。
默認的層集應該在所有平台上都能給出可接受的結果。
對於 Unix 平台,這將是等效於 ":unix:perlio" 或 ":stdio"。如果系統庫提供對緩衝區的快速訪問(在現代架構中不常見),則配置為優先使用 ":stdio" 實現;否則,使用 ":unix:perlio" 實現。
在 Win32 中,此版本(5.30)的默認值為 ":unix:crlf"。Win32 的 ":stdio" 對於 Perl IO 存在一些錯誤/特性不一致,這在某種程度上取決於 C 編譯器的版本和供應商。使用我們自己的 :crlf
層作為緩衝區可以避免這些問題並使事情更加統一。
此版本(5.30)在 Win32 上將 :unix
作為底層,因此仍然使用 C 編譯器的數字文件描述符例程。
在 Perl 在啟用擔保模式時,PERLIO 環境變量將被完全忽略。
當 Perl 使用 -Di 命令行開關運行時,如果設置為文件或設備的名稱,將會將 PerlIO 子系統的某些操作的日誌記錄重定向到指定的文件,而不是默認的 stderr。文件以附加模式打開。Unix 的典型用法是
% env PERLIO_DEBUG=/tmp/perlio.log perl -Di script ...
以及在 Win32 下,大致等效的
> set PERLIO_DEBUG=CON
perl -Di script ...
對於以 setuid 腳本運行的腳本、使用 "-T" 運行的腳本以及在沒有 -DDEBUGGING
支持的 Perl 上運行的腳本,此功能將被禁用。
在查找標準庫之前,在其中查找 Perl 库文件的目錄列表。如果定義了 "PERL5LIB",則不使用 PERLLIB。
在 Perl 在啟用擔保模式時,PERLLIB 環境變量將被完全忽略。
用於加載調試器代碼的命令。默認值為
BEGIN { require "perl5db.pl" }
當 Perl 使用裸 "-d" 開關啟動時,只有 PERL5DB 環境變量才會被使用。
如果設置為 true 值,表示被調試的代碼使用了線程。
僅在 Win32 端口上,可以設置為 Perl 必須在內部使用的替代 shell 以執行 "backtick" 命令或 system()。WindowsNT 上的默認值為 cmd.exe /x/d/c
,Windows95 上的默認值為 command.com /c
。該值被認為是以空格分隔的。在任何需要保護的字符之前(如空格或反斜杠),請在其前面加上另一個反斜杠。
請注意,Perl 不使用 COMSPEC 進行此用途,因為 COMSPEC 在使用者之間具有高度變異性,導致可攜性問題。此外,Perl 可能使用一個不適合互動使用的 shell,將 COMSPEC 設置為這樣的 shell 可能會干擾其他程序的正常運行(通常在 COMSPEC 中尋找適合互動使用的 shell)。
在 Perl 5.10.0 和 5.8.8 之前,運行外部命令時未對 PERL5SHELL 進行污點檢查。建議在 Windows 下以污點模式運行時明確設置(或刪除)$ENV{PERL5SHELL}
。
設置為 1 以允許使用非 IFS 兼容的 LSP(Layered Service Providers)。Perl 通常搜索 IFS 兼容的 LSP,因為這是將 Windows sockets 模擬為真實文件處理程序所必需的。然而,如果您有一個像 McAfee Guardian 這樣的防火牆,它要求所有應用程序使用其 LSP,但它不是 IFS 兼容的,這可能會引起問題,因為顯然 Perl 通常會避免使用此類 LSP。
將此環境變量設置為 1 意味著 Perl 將僅使用目錄中列舉的第一個適合的 LSP,這使得 McAfee Guardian 高興 - 在這種特殊情況下 Perl 仍然有效,因為 McAfee Guardian 的 LSP 實際上還扮演其他允許需要 IFS 兼容性的應用程序工作的遊戲。
只有當 Perl 編譯時包含在 Perl 發行版中的 malloc
時才相關;即,如果 perl -V:d_mymalloc
是 "define"。
如果設置了此選項,則在執行後將輸出內存統計信息。如果設置為大於一的整數,則在編譯後也輸出內存統計信息。
控制對對象和其他引用的全局銷毀行為。有關更多信息,請參閱perlhacktips 中的 "PERL_DESTRUCT_LEVEL"。
設置為 "1"
以在加載動態庫時解析 所有 未定義的符號。默認行為是在使用時解析符號。在擴展的測試期間設置此變量很有用,因為它確保即使測試套件不調用它們,您也會因拼寫錯誤的函數名稱而收到錯誤。
如果使用 use encoding
pragma 而沒有明確指定編碼名稱,則會諮詢 PERL_ENCODING 環境變量以獲取編碼名稱。
(自 Perl 5.8.1 起,Perl 5.18.0 中新的語義) 用於覆蓋 Perl 內部雜湊函數的隨機化。該值以十六進制表示,可能包含前置的 0x。截斷的模式將被視為帶有足夠 0 的後綴。
如果提供了該選項,且未設置 PERL_PERTURB_KEYS
,則 '0' 的值意味著 PERL_PERTURB_KEYS=0
/PERL_PERTURB_KEYS=NO
,而其他任何值都意味著 PERL_PERTURB_KEYS=2
/PERL_PERTURB_KEYS=DETERMINISTIC
。有關 DETERMINISTIC
模式的重要注意事項,請參閱 PERL_PERTURB_KEYS 的文件。
請注意:雜湊種子是敏感信息。為了防止針對 Perl 代碼的本地和遠程攻擊,雜湊已進行隨機化。通過手動設置種子,可能會部分或完全喪失此保護。
有關更多信息,請參閱 perlsec 中的“算法複雜性攻擊”、“PERL_PERTURB_KEYS” 和 “PERL_HASH_SEED_DEBUG”。
(自 Perl 5.18.0 起) 設置為 "0"
或 "NO"
時,則遍歷鍵將在運行之間重複。對哈希的插入不會改變順序,除了提供哈希中更多的空間。當與設置 PERL_HASH_SEED 時,此模式是最接近 5.18 之前行為的。
當設置為 "1"
或 "RANDOM"
時,則遍歷鍵將被隨機化。每次將哈希插入時,鍵的順序將以隨機方式更改。即使已指定 PERL_HASH_SEED,下一次程序運行時,順序可能也不會重複。這是 Perl 的默認模式,當未明確提供 PERL_HASH_SEED 時。
當設置為 "2"
或 "DETERMINISTIC"
時,將鍵插入到哈希中將導致鍵的順序更改,但以一種從程序運行到程序運行重複的方式,前提是使用相同的雜湊種子,且代碼本身不執行任何非確定性操作,並提供完全相同的環境上下文。添加或刪除環境變量可能會且可能會改變鍵的順序。如果代碼的任何部分使用非確定性鍵構建哈希,例如由參考的字符串形式或包含的對象的地址作為鍵的哈希,則這可能會且可能會對進程中的 *每個* 哈希的鍵順序產生全局影響。為了正常工作,此設置必須與 PERL_HASH_SEED 搭配使用以產生確定性結果,事實上,如果您明確設置了 PERL_HASH_SEED
,則不需要再設置此值,它將自動設置為此模式。
注意:使用此選項被認為是不安全的,僅用於調試 Perl 哈希函數中的非確定性行為。請勿在生產環境中使用。
更多信息請參見perlsec 中的“算法複雜性攻擊”以及“PERL_HASH_SEED”和“PERL_HASH_SEED_DEBUG”。您可以使用Hash::Util 中的 hash_traversal_mask()
函數來獲取和設置特定哈希的鍵遍歷遮罩。
(自 Perl 5.8.1 起。) 設置為 "1"
以在執行開始時顯示(到 STDERR)有關哈希函數、種子以及開始時生效的鍵遍歷隨機化類型的信息。這與 “PERL_HASH_SEED” 和 “PERL_PERTURB_KEYS” 結合使用,旨在幫助調試由哈希隨機化引起的非確定性行為。
請注意,有關哈希函數的任何信息,尤其是哈希種子,都是敏感信息:知道它的人可以對 Perl 代碼發起拒絕服務攻擊,甚至是遠程攻擊;有關更多信息,請參見perlsec 中的“算法複雜性攻擊”。請不要向不需要知道的人透露哈希種子。另請參見hash_seed()
和 hash_traversal_mask()
。
例如,輸出可能如下:
HASH_FUNCTION = ONE_AT_A_TIME_HARD HASH_SEED = 0x652e9b9349a7a032 PERTURB_KEYS = 1 (RANDOM)
如果您的 Perl 配置了 -Accflags=-DPERL_MEM_LOG,設置環境變量 PERL_MEM_LOG
將啟用記錄調試消息。該值的格式為 <number>[m][s][t]
,其中 number
是您要寫入的文件描述符號(2 是默認值),字母的組合指定您希望獲取有關 (m)emory 和/或 (s)v 的信息,選擇性地帶有 (t)imestamps。例如,PERL_MEM_LOG=1mst
將所有信息記錄到 stdout。您可以以各種方式寫入到其他已打開的文件描述符號。
$ 3>foo3 PERL_MEM_LOG=3m perl ...
這是一個隱藏的翻譯根的邏輯名稱,僅包含 Perl 和 @INC 路徑上的邏輯設備,僅在 VMS 上。其他影響 VMS 上 Perl 的邏輯名稱包括 PERLSHR、PERL_ENV_TABLES 和 SYS$TIMEZONE_DIFFERENTIAL,但是它們是可選的,並在perlvms 和 Perl 源發行版的 README.vms 中進一步討論。
在 Perl 5.8.1 及之後的版本中可用。如果設置為"unsafe"
,將恢復Perl-5.8.0之前的信號行為(即立即但不安全)。如果設置為safe
,則將使用安全(但延遲)的信號。請參閱perlipc中的“延遲信號(安全信號)”。
等同於-C命令行開關。請注意,這不是一個布林變量。將其設置為"1"
並不是“啟用Unicode”的正確方法(不管這意味著什麼)。您可以使用"0"
來“禁用Unicode”,或者在啟動Perl之前在shell中取消設置PERL_UNICODE。有關更多信息,請參閱-C開關的描述。
如果perl已配置為默認不將當前目錄包含在@INC
中,則可以將此變量設置為"1"
以恢復它。這主要用於構建和測試尚未更新以處理“.”不包含在@INC
中的模塊,並且不應在日常使用中設置。環境。
設置為非負整數以種子內部由perl用於各種目的的隨機數生成器。
如果perl以setuid或setgid運行,則將被忽略。僅在某些有限的啟動隨機化(哈希鍵)時使用,如果啟用了-T
或-t
perl。
Perl可能被構建為忽略此變量。
當設置為整數值時,此值將用於種子perl內部隨機數生成器用於rand()
時,如果使用未明確的srand()
調用或進行明確的無參數srand()
調用。
通常在调用 rand()
之前调用 srand()
,或者明确调用 srand()
而不带参数,应该会导致随机数生成器尽最大努力使用相对高质量的随机种子来初始化生成器状态。当设置了该环境变量时,使用的种子将以确定性的方式从环境变量中提供的值计算,这样应用程序进程以及任何派生或线程都应该继续具有自己独特的种子,但是程序可以运行两次,结果与 rand()
无关(假设其他一切相等)。
PERL_RAND_SEED 旨在用于性能测量和调试,明确声明不适用于稳定测试。唯一的保证是特定的 Perl 可执行文件将连续两次产生相同的结果,不能保证不同 Perl 发行版之间或在不同架构上的结果相同。
如果 perl 以 setuid 或 setgid 方式运行,则会被忽略。
Perl 还有环境变量来控制 Perl 处理特定自然语言的数据的方式;请参阅 perllocale。
Perl 及其各种模块和组件,包括其测试框架,有时可能会使用某些其他环境变量。其中一些特定于特定平台。请查阅相应的模块文档以及您所使用平台的任何文档(如 perlsolaris、perllinux、perlmacosx、perlwin32 等),了解那些特定情况下的变量。
Perl 使所有环境变量都可用于正在执行的程序,并将这些变量传递给它启动的任何子进程。但是,以 setuid 方式运行的程序最好在做任何其他操作之前执行以下几行代码,以保持人们诚实。
$ENV{PATH} = "/bin:/usr/bin"; # or whatever you need
$ENV{SHELL} = "/bin/sh" if exists $ENV{SHELL};
delete @ENV{qw(IFS CDPATH ENV BASH_ENV)};
某些选项,特别是 -I
、-M
、PERL5LIB
和 PERL5OPT
可能会相互影响,它们应用的顺序很重要。
请注意,本节不是记录 Perl 解释器内部的实际情况,而是记录其效果。
多个 -I
选项的效果是从右到左将它们 unshift
到 @INC
中。例如,
perl -I 1 -I 2 -I 3
将首先将 3
添加到 @INC
的前面,然后是 2
,然后是 1
。结果是 @INC
以以下方式开始:
qw(1 2 3)
多个 -M
选项从左到右处理。因此,
perl -Mlib=1 -Mlib=2 -Mlib=3
首先使用 lib pragma 将 1
添加到 @INC
,然后是 2
,然后是 3
,结果是 @INC
以以下方式开始:
qw(3 2 1)
這包含一個以冒號分隔的目錄列表。整個列表一次性添加到@INC
之前。這
PERL5LIB=1:2:3 perl
將導致@INC
以以下開頭
qw(1 2 3)
PERL5LIB
先應用,然後應用所有-I
引數,然後應用所有-M
引數。這
PERL5LIB=e1:e2 perl -I i1 -Mlib=m1 -I i2 -Mlib=m2
將導致@INC
以以下開頭
qw(m2 m1 i1 i2 e1 e2)
這包含一個以空格分隔的開關列表。我們在本節僅考慮-M
和-I
的影響。
在從命令行正常處理-I
開關後,將提取PERL5OPT中的所有-I
開關。它們從左到右處理,而不是從右到左。還請注意,儘管命令行中的-I
及其目錄之間允許空白,但在PERL5OPT
中不允許。
在從命令行正常處理-M
開關後,將提取PERL5OPT中的所有-M
開關。它們從左到右處理,即與命令行上的開關相同。
舉個例子可能會更清楚
export PERL5OPT="-Mlib=optm1 -Iopti1 -Mlib=optm2 -Iopti2"
export PERL5LIB=e1:e2
perl -I i1 -Mlib=m1 -I i2 -Mlib=m2
將導致@INC
以以下開頭
qw(
optm2
optm1
m2
m1
opti2
opti1
i1
i2
e1
e2
)
在上面的示例中忽略了一些複雜情況