Perl 基础语法
December 2, 2024About 2 min
Perl 基础语法
偶尔要改别人留下的 Perl 脚本,记一遍基础语法备查。脚本第一行常带 -w 开警告:
#!/usr/bin/perl -w # 显示程序中的警告,不影响执行但方便排错
标识符
- 大小写敏感
- 由字母、数字、下划线组成
- 必须以字母或下划线开头
输入输出
print 忽略参数间的空格,但字符串里的换行和缩进会原样保留:
print "Hello, world\n"; # Hello, world
print "Hello
world\n"; # 换行和那串空格都会输出
注释
单行用 #;多行用 POD 块:
# 单行注释
=pod
这是一个多行注释
这是一个多行注释
=cut
单引号 vs 双引号
- 双引号会解析转义字符和变量
- 单引号原样输出
print "Hello, world\n"; # 双引号:换行生效
print 'Hello, world\n'; # 单引号:原样输出 Hello, world\n
Here 文档
Here 文档(heredoc)是定义多行字符串的写法,Perl、PHP、Python、Ruby 以及各种 shell 都有。几条规矩:
- 起始标记后必须接分号,否则编译不过。
EOF可换成任意标记,只要起止一致。- 结束标记必须顶格独占一行,前后不能有空白或其它字符。
- 起始标记带双引号(或不带)会解释内嵌变量和转义符;带单引号则不解释——相当于
qq和q的区别。 - 内容里的单双引号不用转义。
$a = 10;
$var = <<"EOF";
这是一个 Here 文档实例,使用双引号。
例如:a = $a
EOF
print "$var\n"; # a = 10,变量被解析
$var = <<'EOF';
这是一个 Here 文档实例,使用单引号。
例如:a = $a
EOF
print "$var\n"; # a = $a,原样输出
变量
Perl 变量无需声明类型,分三种:标量、数组、哈希,前缀分别是 $ @ %。
标量(数字 / 字符串 / 浮点数)
字符串连接用 .:
my $str = "hello" . "world"; # 字符串连接
my $num = 5 + 10; # 数字相加
my $mix = $str . $num;
print($mix); # helloworld15
数组
索引从 0 开始,支持正负索引、切片、splice 替换:
my @array = (1, 2, 3);
print("@array\n"); # 1 2 3
print("$array[0]\n"); # 1
my @array = (1..10);
my @test = @array[1, 3, 5]; # 2 4 6,按索引取切片
my @no = @array[1..5]; # 2 3 4 5 6,按范围取切片
# splice @ARRAY, OFFSET [, LENGTH [, LIST]]
splice(@array, 5, 2, 20..21); # 从第 5 位起替换 2 个元素:1 2 3 4 5 20 21 8 9 10
my @letters = ("a".."z"); # a b c ... z
哈希
my %h = ('a' => 1, 'b' => 2);
print(%h); # a1b2
print($h{a}); # 1
上下文
同一个表达式在不同上下文里行为不同。数组赋给数组是复制,赋给标量返回元素个数:
my @names = ('google', 'runoob', 'taobao');
my @copy = @names; # 列表上下文:复制数组
my $size = @names; # 标量上下文:返回元素个数 3