特殊變量

2018-02-24 16:03 更新

$_

$_?是默認(rèn)變量。它常用于內(nèi)置函數(shù)的默認(rèn)參數(shù)。

while ( <> ) {  # Read a line into $_
    print lc;   # print lc($_)
}

這與下列代碼相同:

while ( $it = <> ) {
    print lc($it);
}

$0

$0?包含執(zhí)行程序的名稱,正如給 Shell 的一樣。如果程序直接通過 Perl 解釋器執(zhí)行,那么?$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?數(shù)組找到的第一個元素。

@ARGV

@ARGV?包含給程序的參數(shù),順序與 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?包含當(dāng)前環(huán)境的拷貝。該環(huán)境由 Perl 創(chuàng)建的子 Shell 所給予。

這對?taint?模式很重要,%ENV?具有能修改 Shell 行為的內(nèi)容。正因如此, perlsec 推薦在?taint?模式執(zhí)行命令時使用下列代碼:

$ENV{'PATH'} = '/bin:/usr/bin'; # change to your real path
delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};

%SIG

Perl 具有豐富的信號處理能力。使用?%SIG?變量,你能夠在當(dāng)信號發(fā)送給運行 的進(jìn)程時執(zhí)行任意子例程。

如果你有耗時進(jìn)程,這將特別有用。通過發(fā)送信號(通常是?SIGHUP)來重載配置 ,你不必啟動和停止進(jìn)程。

通過分別賦值?$SIG{__DIE__}?和?$SIG{__WARN__},你也可以更改?die?和?warn?的行為。

<>

鉆石操作符?<>?用于程序期望的輸入時,而不用關(guān)心它如何到達(dá)。

如果程序收到任何參數(shù),它們將分成文件名及其內(nèi)容發(fā)送給?<>。否則,使用標(biāo)準(zhǔn) 輸入(STDIN)。

<>?對于過濾程序特別有用。

<DATA>DATA

如果程序包含自身為一行的魔法標(biāo)記?__DATA__,那么它下面的任何東東均可通過 魔法<DATA>?句柄為程序所用。

如果你想在程序中包含數(shù)據(jù),但又想與主程序邏輯分開,那么這將特別有用。

$!

當(dāng)使用?system?執(zhí)行命令時,如果命令返回非真狀態(tài),那么?$!?將為真。否則, 可能未被執(zhí)行。$!?將包含出錯消息。

$@

如果使用?eval,那么?$@?將包含?eval?所拋出的語法錯誤。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號