## $_
`$_`?是默認變量。它常用于內置函數的默認參數。
~~~
while ( <> ) { # Read a line into $_
print lc; # print lc($_)
}
~~~
這與下列代碼相同:
~~~
while ( $it = <> ) {
print lc($it);
}
~~~
## $0
`$0`?包含執行程序的名稱,正如給 Shell 的一樣。如果程序直接通過 Perl 解釋器執行,那么?`$0`?包含文件名稱。
~~~
$ cat file.pl
#!/usr/bin/perl
print $0, "\n";
$ ./file.pl
file.pl
$ perl file.pl
file.pl
$ perl ./file.pl
./file.pl
$ cat file.pl | perl
-
~~~
`$0`?是 C 程序員期望從?`argv`?數組找到的第一個元素。
## @ARGV
`@ARGV`?包含給程序的參數,順序與 Shell 中一樣。
~~~
$ perl -e 'print join( ", ", @ARGV), "\n"' 1 2 3
1, 2, 3
$ perl -e 'print join( ", ", @ARGV), "\n"' 1 "2 3" 4
1, 2 3, 4
~~~
C 程序員可能會搞混,因為?`$ARGV[0]`?是他們的?`argv[1]`。不要犯這樣的錯。
## @INC
`@INC`?包含 Perl 搜索模塊的所有路徑。
Perl 程序員通過后置或前置到?`@INC`?添加庫路徑。眼下,使用?`use lib`?代替。 下面的代碼等效:
~~~
BEGIN { unshift @INC, "local/lib" };
use lib "local/lib";
~~~
## %ENV
`%ENV`?包含當前環境的拷貝。該環境由 Perl 創建的子 Shell 所給予。
這對?`taint`?模式很重要,`%ENV`?具有能修改 Shell 行為的內容。正因如此, perlsec 推薦在?`taint`?模式執行命令時使用下列代碼:
~~~
$ENV{'PATH'} = '/bin:/usr/bin'; # change to your real path
delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};
~~~
## %SIG
Perl 具有豐富的信號處理能力。使用?`%SIG`?變量,你能夠在當信號發送給運行 的進程時執行任意子例程。
如果你有耗時進程,這將特別有用。通過發送信號(通常是?`SIGHUP`)來重載配置 ,你不必啟動和停止進程。
通過分別賦值?`$SIG{__DIE__}`?和?`$SIG{__WARN__}`,你也可以更改?`die`?和?`warn`?的行為。
## <>
鉆石操作符?`<>`?用于程序期望的輸入時,而不用關心它如何到達。
如果程序收到任何參數,它們將分成文件名及其內容發送給?`<>`。否則,使用標準 輸入(`STDIN`)。
`<>`?對于過濾程序特別有用。
## `<DATA>`和__DATA__
如果程序包含自身為一行的魔法標記?`__DATA__`,那么它下面的任何東東均可通過 魔法`<DATA>`?句柄為程序所用。
如果你想在程序中包含數據,但又想與主程序邏輯分開,那么這將特別有用。
## $!
當使用?`system`?執行命令時,如果命令返回非真狀態,那么?`$!`?將為真。否則, 可能未被執行。`$!`?將包含出錯消息。
## $@
如果使用?`eval`,那么?`$@`?將包含?`eval`?所拋出的語法錯誤。