📜  Perl 中的特殊变量(1)

📅  最后修改于: 2023-12-03 15:18:17.811000             🧑  作者: Mango

Perl 中的特殊变量

在 Perl 中,有一些称为“特殊变量”的变量,它们有着预定义的含义和用途。

$_

$_ 是 Perl 中最常用的特殊变量之一。它表示当前正在处理的变量,通常用作默认变量。

例如,在字符串操作中,如果你没有指定要操作的变量,Perl 就会默认使用 $_:

my $str = "hello world";
$str =~ s/world/Perl/;  # 等价于 $_ =~ s/world/Perl/
print $str;  # 输出 "hello Perl"

在循环中,如果你没有指定循环变量,Perl 就会默认使用 $_:

my @list = qw/a b c/;
foreach (@list) {  # 等价于 foreach my $var (@list) {
    print;  # 等价于 print $_;
}
@_ 和 @ARGV

@_ 和 @ARGV 这两个特殊变量都是数组,它们分别用于保存子例程(或函数)的参数和命令行参数。

在子例程中,如果你没有指定参数,Perl 就会将所有参数存放在 @_ 中:

sub add {
    my ($x, $y) = @_;
    return $x + $y;
}
print add(2, 3);  # 输出 5

在命令行运行 Perl 脚本时,传入的参数会被保存在 @ARGV 中:

# 假设脚本名为 my_script.pl,命令行运行:perl my_script.pl foo bar baz
print $ARGV[0];  # 输出 "foo"
print $ARGV[1];  # 输出 "bar"
print $ARGV[2];  # 输出 "baz"
%_

%_ 是一个哈希表,它类似于 $,但提供了更灵活的操作方式。在一些情况下,你可以使用 % 来替代 $_,从而简化代码。

举例来说,在 grep 和 map 函数中,如果你没有指定循环变量,Perl 就会默认使用 $_:

my @list = qw/hello world/;
my @filtered = grep { $_ =~ /world/ } @list;  # 过滤包含 "world" 的元素
my @mapped = map { $_ x 2 } @list;  # 将每个元素复制一遍

如果使用 %_,代码可以更加简洁:

my @list = qw/hello world/;
my @filtered = grep /world/, @list;  # 等价于 grep { $_ =~ /world/ } @list;
my @mapped = map $_ x 2, @list;  # 等价于 map { $_ x 2 } @list;
$!

$! 存储了上一个系统调用返回的错误信息。在 Linux 系统下,你可以使用 perror 命令查看错误信息。在 Perl 中,使用 $! 可以获得相同的信息。

例如,如果你尝试打开一个不存在的文件,Perl 会返回一个错误,你可以使用 $! 来查看错误信息:

open my $fh, "<", "not_exists.txt" or die "无法打开文件:$!";
print "成功打开文件\n";

这段代码会输出“无法打开文件:No such file or directory”。$! 存储了底层的错误码,Perl 会自动将其翻译成可读的错误消息。

$@

$@ 存储了上一个 eval 返回的错误信息。在 Perl 中,你可以像其他语言一样使用 try/catch 来捕获异常。

举个例子,下面的代码尝试将一个非数字的字符串转换为数字:

eval { my $num = int("abc"); };
if ($@) {
    print "捕获到异常:$@\n";
}

这段代码会输出“捕获到异常:Argument "`abc'" isn't numeric in int”,其中 $@ 存储了 eval 的异常信息。