特殊变量 #

一、特殊变量概述 #

Perl提供了许多内置的特殊变量,用于存储系统状态、控制程序行为。这些变量通常具有简短的名称。

二、默认变量$_ #

$_ 是Perl最常用的特殊变量,称为默认变量。

2.1 在函数中的使用 #

许多函数默认操作 $_

perl
my @arr = (1, 2, 3, 4, 5);

foreach (@arr) {
    print;
    print "\n";
}

等价于:

perl
foreach my $item (@arr) {
    print $item;
    print "\n";
}

2.2 在正则表达式中 #

perl
$_ = "Hello, World!";
if (/World/) {
    print "Found\n";
}

s/World/Perl/;
print;

2.3 常用函数 #

以下函数默认使用 $_

perl
$_ = "  hello world  ";

chomp;
chop;
print;
say;
uc;
lc;
length;

2.4 显式使用 #

perl
my $line = "  Hello  ";
$_ = $line;
s/^\s+//;
s/\s+$//;
my $cleaned = $_;

三、命令行参数@ARGV #

@ARGV 存储命令行参数。

3.1 基本使用 #

perl
#!/usr/bin/perl
use strict;
use warnings;

print "Script name: $0\n";
print "Arguments: @ARGV\n";
print "First arg: $ARGV[0]\n";
print "Arg count: " . scalar @ARGV . "\n";

运行:

bash
perl script.pl arg1 arg2 arg3

输出:

text
Script name: script.pl
Arguments: arg1 arg2 arg3
First arg: arg1
Arg count: 3

3.2 遍历参数 #

perl
foreach my $arg (@ARGV) {
    print "Argument: $arg\n";
}

3.3 处理选项 #

简单选项处理:

perl
use strict;
use warnings;

my $verbose = 0;
my @files;

foreach my $arg (@ARGV) {
    if ($arg eq '-v' || $arg eq '--verbose') {
        $verbose = 1;
    } elsif ($arg =~ /^-/) {
        die "Unknown option: $arg\n";
    } else {
        push @files, $arg;
    }
}

print "Verbose: $verbose\n";
print "Files: @files\n";

3.4 Getopt模块 #

推荐使用 Getopt::Long

perl
use strict;
use warnings;
use Getopt::Long;

my $verbose = 0;
my $output = '';

GetOptions(
    'verbose' => \$verbose,
    'output=s' => \$output,
);

print "Verbose: $verbose\n";
print "Output: $output\n";
print "Remaining: @ARGV\n";

四、环境变量%ENV #

%ENV 存储环境变量。

4.1 读取环境变量 #

perl
print "PATH: $ENV{PATH}\n";
print "HOME: $ENV{HOME}\n";
print "USER: $ENV{USER}\n";

4.2 设置环境变量 #

perl
$ENV{MY_VAR} = "my_value";
$ENV{PATH} = "/usr/local/bin:$ENV{PATH}";

4.3 遍历环境变量 #

perl
foreach my $key (sort keys %ENV) {
    print "$key=$ENV{$key}\n";
}

4.4 删除环境变量 #

perl
delete $ENV{MY_VAR};

五、输入输出相关 #

5.1 $. #

$. 表示当前读取的行号:

perl
while (my $line = <DATA>) {
    print "Line $.: $line";
}

__DATA__
First line
Second line
Third line

5.2 $/ #

$/ 是输入记录分隔符,默认为换行符:

perl
{
    local $/ = undef;
    my $content = <DATA>;
    print $content;
}

按段落读取:

perl
{
    local $/ = "";
    while (my $para = <DATA>) {
        print "Paragraph:\n$para\n";
    }
}

5.3 $\ #

$\ 是输出记录分隔符:

perl
{
    local $\ = "\n---\n";
    print "Hello";
    print "World";
}

5.4 $, #

$, 是打印列表时的分隔符:

perl
{
    local $, = ", ";
    print "a", "b", "c";
    print "\n";
}

六、正则表达式相关 #

6.1 匹配变量 #

perl
my $str = "Hello, World!";

if ($str =~ /(\w+), (\w+)/) {
    print "Full match: $&\n";
    print "Before: $`\n";
    print "After: $'\n";
    print "Group 1: $1\n";
    print "Group 2: $2\n";
}

6.2 捕获变量 #

perl
my $date = "2024-03-27";

if ($date =~ /(\d{4})-(\d{2})-(\d{2})/) {
    my ($year, $month, $day) = ($1, $2, $3);
    print "Year: $year, Month: $month, Day: $day\n";
}

七、进程相关 #

7.1 $$ #

$$ 是当前进程ID:

perl
print "Process ID: $$\n";

7.2 $0 #

$0 是脚本名称:

perl
print "Script: $0\n";

修改进程名:

perl
$0 = "my_perl_script";

7.3 $? #

$? 是子进程退出状态:

perl
system("ls -la");
if ($? == 0) {
    print "Command succeeded\n";
} else {
    print "Command failed: $?\n";
}

7.4 $! #

$! 是系统错误信息:

perl
open my $fh, "<", "nonexistent.txt"
    or die "Cannot open file: $!";

八、其他特殊变量 #

8.1 @INC #

@INC 是模块搜索路径:

perl
print "Module paths:\n";
print "$_\n" foreach @INC;

添加搜索路径:

perl
use lib "/path/to/modules";
push @INC, "/another/path";

8.2 %INC #

%INC 是已加载模块:

perl
use strict;
use warnings;

foreach my $module (sort keys %INC) {
    print "$module => $INC{$module}\n";
}

8.3 @F #

@F 在自动分割模式下使用:

perl
#!/usr/bin/perl -a
use strict;
use warnings;

print "First field: $F[0]\n";
print "All fields: @F\n";

8.4 $" #

$" 是数组插值时的分隔符:

perl
my @arr = (1, 2, 3);
{
    local $" = " | ";
    print "@arr\n";
}

九、特殊文件句柄 #

9.1 STDIN #

标准输入:

perl
print "Enter name: ";
my $name = <STDIN>;
chomp $name;

9.2 STDOUT #

标准输出:

perl
print STDOUT "Hello\n";

9.3 STDERR #

标准错误:

perl
print STDERR "Error message\n";
warn "Warning message\n";

9.4 DATA #

内联数据:

perl
while (my $line = <DATA>) {
    print $line;
}

__DATA__
Line 1
Line 2
Line 3

十、实践练习 #

练习1:命令行计算器 #

perl
#!/usr/bin/perl
use strict;
use warnings;
use v5.10;

die "Usage: $0 <num1> <op> <num2>\n" unless @ARGV == 3;

my ($num1, $op, $num2) = @ARGV;
my $result;

if    ($op eq '+') { $result = $num1 + $num2; }
elsif ($op eq '-') { $result = $num1 - $num2; }
elsif ($op eq '*') { $result = $num1 * $num2; }
elsif ($op eq '/') { $result = $num1 / $num2; }
else { die "Unknown operator: $op\n"; }

say "$num1 $op $num2 = $result";

练习2:环境变量检查 #

perl
#!/usr/bin/perl
use strict;
use warnings;
use v5.10;

my @required = qw(HOME PATH USER);

foreach my $var (@required) {
    if (exists $ENV{$var}) {
        say "$var = $ENV{$var}";
    } else {
        say "$var is not set";
    }
}

练习3:文件行号 #

perl
#!/usr/bin/perl
use strict;
use warnings;
use v5.10;

die "Usage: $0 <filename>\n" unless @ARGV;

my $file = $ARGV[0];
open my $fh, "<", $file or die "Cannot open $file: $!";

while (my $line = <$fh>) {
    printf "%5d: %s", $., $line;
}

close $fh;

十一、总结 #

本章学习了:

  • 默认变量 $_
  • 命令行参数 @ARGV
  • 环境变量 %ENV
  • 输入输出相关变量
  • 正则表达式匹配变量
  • 进程相关变量
  • 特殊文件句柄

下一章将学习运算符。

最后更新:2026-03-27