特殊变量

October 28, 2013 @ 02:05 PM

$_

$_ 是默认变量。它常用于内置函数的默认参数。

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

这与下列代码相同:

  1. while ( $it = <> ) {
  2. print lc($it);
  3. }

$0

$0 包含执行程序的名称,正如给 Shell 的一样。如果程序直接通过 Perl解释器执行,那么 $0 包含文件名称。

  1. $ cat file.pl
  2. #!/usr/bin/perl
  3. print $0, "\n";
  4. $ ./file.pl
  5. file.pl
  6. $ perl file.pl
  7. file.pl
  8. $ perl ./file.pl
  9. ./file.pl
  10. $ cat file.pl | perl
  11. -

$0 是 C 程序员期望从 argv 数组找到的第一个元素。

@ARGV

@ARGV 包含给程序的参数,顺序与 Shell 中一样。

  1. $ perl -e 'print join( ", ", @ARGV), "\n"' 1 2 3
  2. 1, 2, 3
  3. $ perl -e 'print join( ", ", @ARGV), "\n"' 1 "2 3" 4
  4. 1, 2 3, 4

C 程序员可能会搞混,因为 $ARGV[0] 是他们的 argv[1]。不要犯这样的错。

@INC

@INC 包含 Perl 搜索模块的所有路径。

Perl 程序员通过后置或前置到 @INC 添加库路径。眼下,使用 use lib 代替。下面的代码等效:

  1. BEGIN { unshift @INC, "local/lib" };
  2. use lib "local/lib";

%ENV

%ENV 包含当前环境的拷贝。该环境由 Perl 创建的子 Shell 所给予。

这对 taint 模式很重要,%ENV 具有能修改 Shell 行为的内容。正因如此,perlsec 推荐在 taint 模式执行命令时使用下列代码:

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

%SIG

Perl 具有丰富的信号处理能力。使用 %SIG 变量,你能够在当信号发送给运行的进程时执行任意子例程。

如果你有耗时进程,这将特别有用。通过发送信号(通常是 SIGHUP)来重载配置,你不必启动和停止进程。

通过分别赋值 $SIG{DIE}$SIG{WARN},你也可以更改 diewarn的行为。

<>

钻石操作符 <> 用于程序期望的输入时,而不用关心它如何到达。

如果程序收到任何参数,它们将分成文件名及其内容发送给 <>。否则,使用标准输入(STDIN)。

<> 对于过滤程序特别有用。

<DATA> 和DATA

如果程序包含自身为一行的魔法标记 DATA,那么它下面的任何东东均可通过魔法 <DATA> 句柄为程序所用。

如果你想在程序中包含数据,但又想与主程序逻辑分开,那么这将特别有用。

$!

当使用 system 执行命令时,如果命令返回非真状态,那么 $! 将为真。否则,可能未被执行。$! 将包含出错消息。

$@

如果使用 eval,那么 $@ 将包含 eval 所抛出的语法错误。