Perl语言学习笔记
一、引言
最近研究的时候经常碰到perl语言的CGI后端程序代码,跟传统的C语言语法有些区别,这里做一下笔记。
Perl,一种功能丰富的计算机程序语言,运行在超过100种计算机平台上,适用广泛,从大型机到便携设备,从快速原型创建到大规模可扩展开发。
Perl 语言的应用范围很广,除CGI以外,Perl被用于图形编程、系统管理、网络编程、金融、生物以及其他领域。由于其灵活性,Perl被称为脚本语言中的瑞士军刀。
二、特点
1、注释
使用# 是单行注释,多行注释是=pdo开头,=cut结尾:
#!/usr/bin/perl
# 这是一个单行注释
print "Hello, world\n";
=pdo 注释
这是一个多行注释
这是一个多行注释
这是一个多行注释
=cut
2、函数执行
print 可以使用括号来输出字符串,也可以不使用括号:
print("Hello, world\n");
print "Hello, world\n";
3、数据类型
序号 | 类型 | 说明 |
1 | 标量 $var="12345" | 可以为数字、字符串、浮点数等 |
2 | 数组 @array=(1,2,3,4,5) | 以字符@开头,索引0开始,使用这种调用单个元素的方法:array[0] |
3 | 哈希 %hash=('a'=>'1', 'b'=>'2') %hash=('a', '1', 'b', '2') %hash=(-a=>'1', -b=>'2') | 无序key/value组合,多种写法,使用这种调用单个元素的方法:%hash{"a"}、%hash{-a} |
变量的声明
1)my 作用:把变量的名字和值都限于某个范围内,也就是说,该变量只能本层模块或者函数
可以看到这个变量,高一层或者低一层的都看不到。
2)our 作用:把变量名字限于某个范围,其实就是明确声明一个”全局变量”,虽然是在某个模块或者函数里面定义,外面的也可以访问,如果已经声明过了,再次用our,表示此处用的和之前声明的our变量是同一个。
3)local 作用:把值局限于某个范围,该范围与my有所区别的是,包含本层及本层的下层,但本层的上一层不可以访问。
4)全局变量
use vars qw(szVersionCode,szVersionName), 作用是把变量szVersionCode和szVersionName定义成全局变量。 其作用与our作用等同。
4、转义字符
转义字符 | 含义 |
---|---|
\\ | 反斜线 |
\' | 单引号 |
\" | 双引号 |
\a | 系统响铃 |
\b | 退格 |
\f | 换页符 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\0nn | 创建八进制格式的数字 |
\xnn | 创建十六进制格式的数字 |
\cX | 控制字符,x可以是任何字符 |
\u | 强制下一个字符为大写 |
\l | 强制下一个字符为小写 |
\U | 强制将所有字符转换为大写 |
\L | 强制将所有的字符转换为小写 |
\Q | 将到\E为止的非单词(non-word)字符加上反斜线 |
\E | 结束\L、\U、\Q |
5、条件语句
语句 | 描述 |
---|---|
if 语句 | 一个 if 语句 由一个布尔表达式后跟一个或多个语句组成。 |
if...else 语句 | 一个 if 语句 后可跟一个可选的 else 语句,else 语句在布尔表达式为假时执行。 |
if...elsif...else 语句 | 您可以在一个 if 语句后可跟一个可选的 elsif 语句,然后再跟另一个 else 语句。 |
unless 语句 | 一个 unless 语句 由一个布尔表达式后跟一个或多个语句组成。 |
unless...else 语句 | 一个 unless 语句 后可跟一个可选的 else 语句。 |
unless...elsif..else statement | 一个 unless 语句 后可跟一个可选的 elsif 语句,然后再跟另一个 else 语句。 |
switch 语句 | 在最新版本的 Perl 中,我们可以使用 switch 语句。它根据不同的值执行对应的代码块。 |
6、循环
循环类型
循环类型 | 描述 |
---|---|
while 循环 | 当给定条件为 true 时,重复执行语句或语句组。循环主体执行之前会先测试条件。 |
until 循环 | 重复执行语句或语句组,直到给定的条件为 true。 循环主体执行之前会先测试条件。 |
for 循环 | 多次执行一个语句序列,简化管理循环变量的代码。 |
foreach 循环 | foreach 循环用于迭代一个列表或集合变量的值。 |
do...while 循环 | 除了它是在循环主体结尾测试条件外,其他与 while 语句类似。 |
嵌套循环 | 您可以在 while、for 或 do..while 循环内使用一个或多个循环。 |
循环控制
控制语句 | 描述 |
---|---|
next 语句 | 停止执行从next语句的下一语句开始到循环体结束标识符之间的语句,转去执行continue语句块,然后再返回到循环体的起始处开始执行下一次循环。 |
last 语句 | 退出循环语句块,从而结束循环 |
continue 语句 | continue 语句块通常在条件语句再次判断前执行。 |
redo 语句 | redo 语句直接转到循环体的第一行开始重复执行本次循环,redo语句之后的语句不再执行,continue语句块也不再执行; |
goto 语句 | Perl 有三种 goto 形式:goto LABLE,goto EXPR,和 goto &NAME。 |
7、函数
#!/usr/bin/perl
# 函数定义
sub func{
# 参数;使用特殊数组 @_ 标明,第一个参数为 $_[0], 第二个参数为 $_[1]...
foreach $item (@_){
print "item:".$item."\n";
}
# 返回值;如果没有使用 return 语句,则子程序的最后一行语句将作为返回值。
# 不使用 return
$_[0]+$_[1];
# 使用 return
# return $_[0]+$_[1];
}
# 函数调用,在 Perl 5.0 以下版本调用函数是&func(1,2);
$sum = func(1,2);
print "sum:".$sum."\n";
结果为:
item:1
item:2
sum:3
8、正则表达式
正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。
Perl语言的正则表达式功能非常强大,基本上是常用语言中最强大的,很多语言设计正则式支持的时候都参考Perl的正则表达式。
Perl的正则表达式的三种形式,分别是匹配,替换和转化:
- 匹配:m//(还可以简写为//,略去m)
- 替换:s///
- 转化:tr///
这三种形式一般都和 =~ 或 !~ 搭配使用, =~ 表示相匹配,!~ 表示不匹配。
1)匹配示例
#!/usr/bin/perl
$string = "welcome to zhiwanyuzhou site.";
$string =~ m/wan/;
print "匹配前的字符串: $`\n";
print "匹配的字符串: $&\n";
print "匹配后的字符串: $'\n";
结果为:
匹配前的字符串: welcome to zhi
匹配的字符串: wan
匹配后的字符串: yuzhou site.
2)替换示例
#!/usr/bin/perl
$string = "welcome to baidu site.";
$string =~ s/baidu/zhiwanyuzhou/;
print "$string\n";
结果为:
welcome to zhiwanyuzhou site.
3)转化示例
#!/usr/bin/perl
$string = 'welcome to zhiwanyuzhou site.';
$string =~ tr/a-z/A-z/;
print "$string\n";
结果为:
WELCOME TO ZHIWANYUZHOU SITE.
三、CGI相关
所有的CGI程序都接收以下的环境变量,这些变量在CGI程序中发挥了重要的作用:
变量名 | 描述 |
---|---|
CONTENT_TYPE | 这个环境变量的值指示所传递来的信息的MIME类型。目前,环境变量CONTENT_TYPE一般都是:application/x-www-form-urlencoded,他表示数据来自于HTML表单。 |
CONTENT_LENGTH | 如果服务器与CGI程序信息的传递方式是POST,这个环境变量即使从标准输入STDIN中可以读到的有效数据的字节数。这个环境变量在读取所输入的数据时必须使用。 |
HTTP_COOKIE | 客户机内的 COOKIE 内容。 |
HTTP_USER_AGENT | 提供包含了版本数或其他专有数据的客户浏览器信息。 |
PATH_INFO | 这个环境变量的值表示紧接在CGI程序名之后的其他路径信息。它常常作为CGI程序的参数出现。 |
QUERY_STRING | 如果服务器与CGI程序信息的传递方式是GET,这个环境变量的值即使所传递的信息。这个信息经跟在CGI程序名的后面,两者中间用一个问号'?'分隔。 |
REMOTE_ADDR | 这个环境变量的值是发送请求的客户机的IP地址,例如192.168.1.100。这个值总是存在的。而且它是Web客户机需要提供给Web服务器的唯一标识,可以在CGI程序中用它来区分不同的Web客户机。 |
REMOTE_HOST | 这个环境变量的值包含发送CGI请求的客户机的主机名。如果不支持你想查询,则无需定义此环境变量。 |
REQUEST_METHOD | 提供脚本被调用的方法。对于使用 HTTP/1.0 协议的脚本,仅 GET 和 POST 有意义。 |
SCRIPT_FILENAME | CGI脚本的完整路径 |
SCRIPT_NAME | CGI脚本的的名称 |
SERVER_NAME | 这是你的 WEB 服务器的主机名、别名或IP地址。 |
SERVER_SOFTWARE | 这个环境变量的值包含了调用CGI程序的HTTP服务器的名称和版本号。 |
以下是一个简单的CGI脚本输出CGI的环境变量:
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print '<meta charset="utf-8">';
print "<font size=+1>环境变量:</font>\n";
foreach (sort keys %ENV)
{
print "<b>$_</b>: $ENV{$_}<br>\n";
}
print "<font size=+1>参数:</font>\n";
local ($buffer, @pairs, $pair, $name, $value, %FORM);
# 读取信息
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST")
{
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}else {
$buffer = $ENV{'QUERY_STRING'};
}
# 读取 name/value 对信息
@pairs = split(/&/, $buffer);
foreach $pair (@pairs)
{
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%(..)/pack("C", hex($1))/eg;
$FORM{$name} = $value;
print "<b>$name</b>: $value<br>\n";
}
1;
1;在模块的结尾意味着模块返回true以use/require语句。 它可以用来判断模块初始化是否成功。 否则, use/require将失败。
四、参考文档
https://perldoc.perl.org/perlre
https://www.w3cschool.cn/perl/perl-intro.html
https://www.runoob.com/perl/perl-tutorial.html
https://blog.csdn.net/weixin_43907175/article/details/122415870