Perl语言学习笔记

admin 2024年1月21日15:28:40评论30 views字数 4643阅读15分28秒阅读模式

偷偷爱一个人是很幸福的,因为你永远也不会担心失恋

恋爱都没谈过,怎么找女朋友啊!

一、引言

perl语言的CGI后端程序代码,跟传统的C语言语法有些区别,这里做一下笔记。

Perl语言,一种功能丰富的计算机程序语言,运行在超过100种计算机平台上,适用广泛,从大型机到便携设备,从快速原型创建到大规模可扩展开发。

Perl 语言的应用范围很广,除CGI以外,Perl被用于图形编程、系统管理、网络编程、金融、生物以及其他领域。由于其灵活性,Perl被称为脚本语言中的瑞士军刀。

Perl 编程语言 - www.perl.org

Perl语言学习笔记

二、特点

1、注释

使用# 是单行注释,多行注释是=pdo开头,=cut结尾:

#!/usr/bin/perl

# 这是一个单行注释
print "Hello, worldn";

=pdo 注释
这是一个多行注释
这是一个多行注释
这是一个多行注释
=cut

2、函数执行

print 可以使用括号来输出字符串,也可以不使用括号:

print("Hello, worldn");
print "Hello, worldn";

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 垂直制表符
nn 创建八进制格式的数字
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 "$stringn";

结果为:

welcome to zhiwanyuzhou site.
3)转化示例
#!/usr/bin/perl 

$string = 'welcome to zhiwanyuzhou site.';
$string =~ tr/a-z/A-z/;

print "$stringn";

结果为:

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/htmlnn";
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


原文始发于微信公众号(qingjiegong):Perl语言学习笔记

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年1月21日15:28:40
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Perl语言学习笔记https://cn-sec.com/archives/2415092.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息