特殊变量 #
一、特殊变量概述 #
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