Perl从许多语言中借用了语法和概念:awk,sed,C,Bourne Shell,Smalltalk,Lisp甚至是英语。每个简单的语句必须以分号(;)结尾,和Java类似,与Python不同。
一、扩展名
可以在任何普通的简单文本编辑器程序内部创建Perl脚本。按照Perl约定,必须将Perl文件保存为.pl或.PL文件扩展名,才能将其识别为功能良好的Perl脚本。文件名可以包含数字,符号和字母,但不能包含空格。在空格处使用下划线(_)。
二、注释
1. 单行注释
以井号#开头的行是单行注释。简单地说,Perl中的注释以井号符号开头,一直到行尾。
# 单行注释
2. 多行注释
以=开头的行被解释为嵌入式文档(pod)一节的开始,编译器将忽略直到下一个=cut的所有后续行。
=pdo
多行注释
声明:
1.标量:$(字符串,数字等);
2.数组:@
3.哈希:%(集合,键值对)
不同类型的变量可以使用相同的变量名
=cut
# 多行注释
=begin comment
Perl的多行注释
声明:
1.标量:$(字符串,数字等);
2.数组:@
3.哈希:%(集合,键值对)
不同类型的变量可以使用相同的变量名
=cut
# 多行注释
=begin
Perl的多行注释
声明:
1.标量:$(字符串,数字等);
2.数组:@
3.哈希:%(集合,键值对)
不同类型的变量可以使用相同的变量名
=cut
区别就在于第一个=号后面的内容,可以按照自己的喜好自定义。
注意:
- =pod、 =cut只能在行首。
- 以=开头,以=cut结尾。
- =后面要紧接一个字符,=cut后面可以不用。
三、输出方式
print("Hello, World\n");
或者
print "Hello, World\n";
输出:
Hello, World
带不带括弧都可以,要输出的内容用英文双引号括住,结尾以分号结尾,\n是换行符。
输出perl的内容一般都加上\n,否则新的输出就和上一行展示在一起。这个和Java的
System.out.print("Hello, World!");
类似,如果Java输出内容要换行,就可以使用:
System.out.println("Hello, World!");
如果是单引号,就完全当做字符串处理:
print('Hello, World\n');
输出:
Hello, World\n
单引号中是什么就输出什么。
四、Here 文档
Here文档又称作heredoc、hereis、here-字串或here-脚本,是一种在命令行shell(如sh、csh、ksh、bash、PowerShell和zsh)和程序语言(像Perl、PHP、Python和Ruby)里定义一个字串的方法。
my $a = 10;
my $var1 = << "EOF";
这是一个 Here 文档实例,使用双引号。
可以在这输入字符串和变量。
例如:a = $a
# 结尾的EOF后不能加;
EOF
print("$var1\n");
输出结果:
这是一个 Here 文档实例,使用双引号。
可以在这输入字符串和变量。
例如:a = 10
# 结尾的EOF后不能加;
注意:
- 开始标志符后面必须跟分号。
- 结束标志符必须独占一行,且要顶格书写,前后不能衔接任何其他内容。
- 开始标志符可以不带引号或带单双引号,不带引号与带双引号效果一致,解释内嵌的变量和转义符号。带单引号则不解释内嵌的变量和转义符号。
- 当内容需要内嵌引号(单引号或双引号)时,不需要加转义符,本身对单双引号转义。
- 开始标志符和结束标志符可以自定义,但是必须保持一致。
单引号开始标志符
my $var2 = << 'EOF';
这是一个 Here 文档实例,使用单引号。
例如:a = $a
EOF
print("$var2\n");
输出:
这是一个 Here 文档实例,使用单引号。
例如:a = $a
未对变量进行解释,和直接print('');这种里面加单引号是一样的效果。
自定义标志符
my $var3 = << "DOC";
这是一个 Here 文档实例,使用双引号,自定义标志符。
例如:a = $a
DOC
print("$var3\n");
这里面我们使用的是双引号,但是里面的内容我们使用的不是上面例子中的EOF,而是DOC,结果如下:
这是一个 Here 文档实例,使用双引号,自定义标志符。
例如:a = 10
可见和EOF是一样的。
my $var3 = << "DOC"的意思就是说,我给出了一个标记,用来标记一段文字,使用<<将这一段文字指向该变量之中。从下一行开始,知道遇到最后的结束标志符DOC为止,所有的内容都赋值给变量var3。和Linux的shell脚本中的用法是类似的功能。
比如,我们在shell脚本中创建一个文件并写入一段内容:
cat > test.txt << 'EOF'
这是一个 << 测试语句,
使用EOF作为开始和结束标志符
EOF
五、转义符
如果我们需要输出一个特殊的字符,可以使用反斜线(\)来转义,例如输出美元符号($):
my $result = "菜鸟教程 \"runoob\"";
print("$result\n");
print("\$result\n");
输出:
菜鸟教程 "runoob"
$result
可以看出,\首先在定义变量时对双引号进行了转义,也就是说加上\就代表你输入的是什么,展示的就是什么。然后在第二个print中对$进行了转义。
六、命名规范
Perl 的命名是用户编程时使用的名字,在程序中使用的变量名,常量名,函数名,语句块名等统称为标识符。
- 标识符组成单元:英文字母(a~z,A~Z),数字(0~9)和下划线(_)。
- 标识符由英文字母或下划线开头。
- 标识符区分大小写,$runoob 与 $Runoob 表示两个不同变量。
七、变量定义
我们上面的一些例子中,定义变量时都加了my。在之前的文章中我们介绍,perl是自由的,其实就是语法很灵活的,没有那么多规矩。
也正是因为Perl的灵活性和"过度"的冗余语法,也因此获得了仅写(write-only)的"美誉",因为Perl程序可以写得很随意(例如,变量不经声明就可以直接使用),但是可能少写一些字母就会得到意想不到的结果(而不报错),许多Perl程序的代码令人难以阅读,实现相同功能的程序代码长度可以相差十倍百倍,这就令程序的维护者(甚至是编写者)难以维护。
同样的,因为Perl这样随意的特点,可能会导致一些Perl程序员遗忘语法,以至于不得不经常查看Perl手册。
建议的解决方法是在程序里使用use strict;以及use warnings;,并统一代码风格,使用库,而不是自己使用"硬编码"。Perl同样可以将代码书写得像Python或Ruby等语言一样优雅。
如果我们在编写perl脚本的时候没有加这些约束,比如:
use strict;
use warnings FATAL => 'all';
那么代码会非常灵活,这也容易导致代码出错的时候很难排查,因为它不报错。
所以加上这些约束,会让我们的代码更容易阅读和规范。
use strict:指的是使用严格模式,任何变量都必须先定义,定义时使用my或者our来指定范围。
my代表的是局部变量,our代表的是全局变量。
use warnings FATAL => 'all':指的是对所有的错误都发出警告。
如果我们不加这些约束,变量都可以随便定义,如果加了,那么我们定义变量的时候不加my或者our,代码执行的时候就会报错。
所以建议加上这些约束。
本文参考:
菜鸟教程