做网站容易挣钱吗,版式设计素材网站,装饰行业网站建设,网站设计就业前景如何分享 perl 语言学习资源
Perl 教程|极客教程 (geek-docs.com)
Perl [zh] (runebook.dev)
Perl 运算符 | 菜鸟教程 (runoob.com)
Perl Documentation - Perldoc Browser
Search the CPAN - metacpan.org
当然还有一些经典书籍#xff0c;不再列举。 1、数字
1.1、数字表… 分享 perl 语言学习资源
Perl 教程|极客教程 (geek-docs.com)
Perl [zh] (runebook.dev)
Perl 运算符 | 菜鸟教程 (runoob.com)
Perl Documentation - Perldoc Browser
Search the CPAN - metacpan.org
当然还有一些经典书籍不再列举。 1、数字
1.1、数字表示
perl内部会把所有的数字当做浮点数进行处理。如果一个数字太长可以使用下划线将数据分开便于阅读。
与其他语言类似支持整数的其他进制表示十六进制0x八进制0二进制0b。
同样支持幂指数表示。
example
$a 1.23_456;#十进制
print $a\n;$b 0xFF_FF;#十六进制
print $b\n;$c 0377;#八进制
print $c\n;$d 0b1101;#二进制
print $d\n;$e 1.3e-3;#指数表示
print $e\n;
result
1.23456
65535
255
13
0.0013
1.2、数字操作符
基本的加减乘除运算 - * /
取模求余运算 % 对于小数的求余 会将操作数的小数部分直接去掉即向下取整然后再做求余运算如 10.99 % 3 1。可以将操作数变为负数如 -10.01 % -7 -3-10.01 % 7 4
指数运算符 ** 如2**3 8。负数的非整数次方运算会产生复数复数的运算需要Math::Complex 模块。
use Math::Complex;# $cc cplx(3,4);
$cc 34*i;
print $cc**2 . \n; Perl - Math::Complex [zh] (runebook.dev)
这个网址有很多中文的perl语法手册。
2、字符串
2.1、单引号字符串
单引号里面的转义字符只支持单引号和反斜线。其他字符均表示自身。
示例
$s1 asdf\\\\n qwe
\twefff;
print $s1 ;
result
asdf\\n qwe
\twefff
2.2、双引号字符串
双引号字符串支持所有的转义字符。
example
$s2 asdf\\\\nashs\thjlidce12#\;
print $s2;
result
asdf\
ashs hjlidce12#
perl中文教程Perl 教程|极客教程 (geek-docs.com)
2.3、字符串操作符
. 可以将字符串前后连接。
x 可以将字符串复制粘贴x后面的次数如果是小数将小数向下取整后复制粘贴。
字符串和数字之间perl 解释器会根据语境自动转换。
example
print HELLO WORLD . HELLO PERL . \n;# 字符串连接print hello perl \n x 3;print 3 x 10 . \n;print 1 x 3.99 . \n;print A . 3*8 . \n;
result
HELLO WORLD HELLO PERL
hello perl
hello perl
hello perl
3333333333
111
A24
3、perl 内置警告
有几种使能警告的方式 1、在终端运行时 perl -w perl_program.pl 2、 perl代码的第一行#! /usr/bin/perl/ -w 3、perl代码的前面打开使能use warnings; 如果不理解警告信息可以使用诊断use diagnostics;
4、标量变量
标量变量只能存放一个标量值。命名方式和其他语言不一样的是变量名称由$符号后接标识符组成。标识符由数字、字母、下滑线组成不可以由数字开头。
变量赋值几种方式
1、单纯使用 赋值。
2、使用 、*、 /、 .、 等。
字符串标量变量的内插(仅双引号有效)
$str1 12345678980;
$str2 You input $str1;#将str1插入str2
print $str2;
$str3 You input \$str1;#转义字符使得str2不会插入str3
4、if
基本与C语言一致example
需要注意的是 perl 的 elseif 写作 elsif。
$str22 vhwroivqpo;
if($str22 eq abc)
{print OK . \n;
}
else
{print NOT OK .\n;
}
5、用户输入
输入操作符 STDIN 示例
print input something you want please. . \n;
$line STDIN;
chomp $line;
print your input is $line . \n;
chomp 操作用于去掉行尾的换行符。
6、while
perl 程序出现死循环使用Ctrl C强制结束。
while的句法和C语言中差不多。
Perl 循环 | 菜鸟教程 (runoob.com)
$count 0;
while ($count 10) {
$count 2;
print count is now $count\n; #打印出2 4 6 8 10
}
7、undef
变量在定义后如果没有被赋值其默认值为 undef 。
对于数字变量undef 等价于 0。如果是字符串变量undef则表现为空字符串。
8、defined
由于undef 有默认行为在程序执行过程中不报错但是容易产生不易于理解的方面可以使用defined函数分辨变量是否为undef若是 未定义 则返回false否则返回 true 。
example
$ee ;
if(not defined($ee))
{print it is a empty string . \n;
}$ee 123;
if(defined($ee))
{print it is a non-empty string : .$ee . \n;
}
result
it is a empty string
it is a non-empty string :123
9、数组/列表
Perl 数组一个是存储标量值的列表变量变量可以是不同类型。
数组变量以 开头。访问数组元素使用 $ 变量名称 [索引值] 格式来读取实例如下。
索引序号由0开始-1表示列表的最后一个元素$#列表变量名 同样表示最后一个列表元素的索引值。数组内元素的修改则可以通过索引直接赋值的形式进行。
list1 (1,2,3,4,5,6,7,8);
print $list1[1] . \n;
print $list1[$#list1] . \n;# 索引最后一个
print $list1[-1] . \n;# 索引最后一个
$list1[0] 1;
$list1[1] 2;
$list1[2] 1;
$list1[3] 2;
$list1[4] 1;
$list1[5] 2;
$list1[6] 1;
$list1[7] 2;
print $list1[1] . \n;
print $list1[$#list1] . \n;# 索引最后一个
print $list1[-1] . \n;# 索引最后一个
9.1 数组创建
数组变量以 符号开始元素放在括号内也可以以 qw 开始定义数组。Perl 允许使用任何标点符号作为分界符最好不要用 #。
Perl 提供了可以按序列输出的数组形式格式为 起始值 .. 结束值。
p1 qw !12 13 45 56 123 11 2223 2345!;
p2 qw 12 13 45 56 123 11 2223 2345;
p3 qw *12 13 45 56 123 11 2223 2345*;
p4 qw ?12 13 45 56 123 11 2223 2345?;
n1 0..10;
a1 a..d;p5 p2; #将p2列表拷贝到p5。
($p2[0],$p2[1]) ($p2[1],$p2[0]);#变量交换$size1 p1; #数组长度
$max_index $#p1; #数组的最大索引号p6 (p1,n1,a1);#列表的元素也可以为列表print $size1 . \t . $max_index . \n;
print p2;print \n;
print p6;print \n;
print n1;print \n;
print a1;print \n; result
8 7
131245561231122232345
121345561231122232345012345678910abcd
012345678910
abcd
9.2 pop 、push
pop 操作将数组的最后一个元素取出并返回。
push它可以将一个元素或者一列元素加在数组的末尾。
push 的第一个参数或者pop 的唯一参数必须是数组变量。
t1 a..z;print t1;print \n;
$a1 pop t1;print $a1;print \n;
push t1,k;print t1;print \n;
push t1,t1;print t1;print \n;
result
abcdefghijklmnopqrstuvwxyz
z
abcdefghijklmnopqrstuvwxyk
abcdefghijklmnopqrstuvwxykabcdefghijklmnopqrstuvwxyk
9.3 shift 、unshift
unshift 和 shift 对一个数组的开头进行操作数组的左端有最小下标的元素。
unshift类似于pushshift类似于pop。
t1 a..z;print t1;print \n;
$a1 shift t1;print $a1;print \n;
unshift t1,kkkk;print t1;print \n;
unshift t1,t1;print t1;print \n;
result
abcdefghijklmnopqrstuvwxyz
a
kkkkbcdefghijklmnopqrstuvwxyz
kkkkbcdefghijklmnopqrstuvwxyzkkkkbcdefghijklmnopqrstuvwxyz
9.4 取数组子集
t1 (a..z)[10..15];print t1;print \n;
t2 t1[1..3];print t2;print \n;
result
klmnop
lmn
9.5 splice
splice函数用于实现数据元素替换。 示例
t1 (a..z)[10..20];print t1;print \n;
splice t1, 2, 2, qw/ /; print t1;print \n;
splice t1, 4, 2, qw/* */; print t1;print \n; result klmnopqrstu klopqrstu kl**qrstu 9.6 split 示例
# 定义字符串
$var_test runoob;
$var_string www-runoob-com;
$var_names google,taobao,runoob,weibo;# 字符串转为数组
test split(, $var_test);
string split(-, $var_string);
names split(,, $var_names);print $test[3]\n; # 输出 o
print $string[2]\n; # 输出 com
print $names[3]\n; # 输出 weibo result o com weibo 9.7 join example
# 定义字符串
$var_string www-runoob-com;
$var_names google,taobao,runoob,weibo;# 字符串转为数组
string split(-, $var_string);
names split(,, $var_names);# 数组转为字符串
$string1 join( %, string );
$string2 join( *, names );print $string1\n;
print $string2\n; result www%runoob%com google*taobao*runoob*weibo 9.8 sort
sort 操作将输入的一串列表可能是数组根据内部的字符顺序进行排序。如对于ASCII 字符串将根据ASCII 序进行排序。和reverse 一样其参数是不会受到影响的。如果想将某个数组排序那必须将排序之后的结果存回数组中。
# 定义数组
sites qw(google taobao runoob facebook apple blue break cup);
print 排序前: sites\n;# 对数组进行排序
sites sort(sites);
print 排序后: sites\n; result 排序前: google taobao runoob facebook apple blue break cup 排序后: apple blue break cup facebook google runoob taobao 9.9 reverse
reverse逆转操作将输入的一串列表可能是数组按相反的顺序返回。注意reverse 返回逆转的列表它不会改变其参数的值。如果返回值没有赋值给某个变量那这个操作是没有什么意义的。
t1 (a..z)[10..20];print t1\n;
t2 reverse t1;print t2\n;
result k l m n o p q r s t u u t s r q p o n m l k 10、foreach
主要用于遍历列表语法格式 foreach var (list) {
...
}示例 t1 (a..z)[10..20];print t1\n;
foreach $k (t1){print $k \n;
} result k l m n o p q r s t u k l m n o p q r s t u 11、scalar
scalar只是用来告诉perl 解释器这是一个标量。
rocks qw(talc quartz jade obsidian);
print How many rocks do you have?\n;
print I have , rocks, rocks!\n; #错误输出rocks 的名字
print I have . rocks. rocks!\n; #正确输出其数字
print I have , scalar rocks, rocks!\n; #正确输出其数字 result How many rocks do you have? I have talcquartzjadeobsidianrocks! I have 4rocks! I have 4rocks! 12、多行输入 lines STDIN;
lines STDIN; #读入所有的行 chomp (lines); #去掉所有的换行符
或者
chomp (lines STDIN); #读入所有的行不包括换行符
Unix 系统中应当使用CTRLD 表明end-of-file在Windows 系统中使用CTRLZ。
13、子程序函数
语法格式 13.1、向子程序传递参数
Perl 子程序可以和其他编程一样接受多个参数子程序参数使用特殊数组 _ 标明。
因此子程序第一个参数为 $_[0], 第二个参数为 $_[1], 以此类推。
不论参数是标量型还是数组型的用户把参数传给子程序时perl默认按引用的方式调用它们。
# 定义求平均值函数
sub Average{# 获取所有传入的参数$n scalar(_);$sum 0;foreach $item (_){$sum $item;}$average $sum / $n;print 传入的参数为 : ,_\n; # 打印整个数组print 第一个参数值为 : $_[0]\n; # 打印第一个参数print 传入参数的平均值为 : $average\n; # 打印平均值
}# 调用函数
Average(10, 20, 30);
13.2、子程序返回值
子程序可以向其他编程语言一样使用 return 语句来返回函数值。
如果没有使用 return 语句则子程序的最后一行语句将作为返回值。
13.3、子程序的私有变量
默认情况下Perl 中所有的变量都是全局变量这就是说变量在程序的任何地方都可以调用。
如果我们需要设置私有变量可以使用 my 操作符来设置。
my 操作符用于创建词法作用域变量通过 my 创建的变量存活于声明开始的地方直到闭合作用域的结尾。
闭合作用域指的可以是一对花括号中的区域可以是一个文件也可以是一个 if, while, for, foreach, eval字符串。
13.4、变量临时赋值
我们可以使用 local 为全局变量提供临时的值在退出作用域后将原来的值还回去。
local 定义的变量不存在于主程序中但存在于该子程序和该子程序调用的子程序中。
example
# 全局变量
$string Hello, World!;sub PrintRunoob{# PrintHello 函数私有变量local $string;$string Hello, Runoob!;# 子程序调用的子程序PrintMe();print PrintRunoob 函数内字符串值$string\n;
}
sub PrintMe{print PrintMe 函数内字符串值$string\n;
}sub PrintHello{print PrintHello 函数内字符串值$string\n;
}# 函数调用
PrintRunoob();
PrintHello();
print 函数外部字符串值$string\n; result PrintMe 函数内字符串值Hello, Runoob! PrintRunoob 函数内字符串值Hello, Runoob! PrintHello 函数内字符串值Hello, World! 函数外部字符串值Hello, World! 13.5、静态变量
state操作符功能类似于C里面的static修饰符state关键字将局部变量变得持久。
state也是词法变量所以只在定义该变量的词法作用域中有效。 注1state仅能创建闭合作用域为子程序内部的变量。 注2state是从Perl 5.9.4开始引入的所以使用前必须加上 use。 注3state可以声明标量、数组、哈希。但在声明数组和哈希时不能对其初始化至少Perl 5.14不支持。 use feature state;sub PrintCount{state $count 0; # 初始化变量print counter 值为$count\n;$count;
}for (1..5){PrintCount();
}
result counter 值为0 counter 值为1 counter 值为2 counter 值为3 counter 值为4 子程序调用过程中会根据上下文来返回不同类型的值比如以下 localtime() 子程序在标量上下文返回字符串在列表上下文返回列表。
# 标量上下文
my $datestring localtime( time );
print $datestring;print \n;# 列表上下文
# $year 的值是从 1900 年作为起始年开始的计数
($sec,$min,$hour,$mday,$mon, $year,$wday,$yday,$isdst) localtime(time);
printf(%d-%d-%d %d:%d:%d,$year1900,$mon1,$mday,$hour,$min,$sec);print \n;
result Wed Jun 12 15:17:32 2024 2024-6-12 15:17:32 14、运算符合集
14.1、算术运算符 14.2、比较运算符 14.3、逻辑运算符 14.4、赋值运算符 14.5、位运算符 14.6、引号运算符 14.7、其他运算符 14.8、运算符优先级 15、三目运算符 ? : 16、时间日期
Perl中处理时间的函数有如下几种
1、time() 函数返回从1970年1月1日起累计的秒数2、localtime() 函数获取本地时区时间3、gmtime() 函数 获取格林威治时间
Perl 时间日期 | 菜鸟教程 (runoob.com)
17、正则表达式
Perl的正则表达式的三种形式分别是匹配替换和转化: 匹配m//还可以简写为//略去m 替换s/// 转化tr///
这三种形式一般都和 ~ 或 !~ 搭配使用 ~ 表示相匹配!~ 表示不匹配。
Perl 正则表达式 | 菜鸟教程 (runoob.com)
18、POD
pod本身的功能很强大但是对于我而言我喜欢在perl脚本中用pod、cut实现多行注释。
podAuthor:
Abstract:
Date:
Note:cut
19、__DATA__、__END__
可以将其后的代码注释掉。
example
print vcqhewviu . \n;# __END__
__DATA__print vcqhewviu . \n;
print vcqhewviu . \n;
print vcqhewviu . \n;
result vcqhewviu 20、哈希
简单来说哈希是 key/value 对的集合。
Perl中哈希变量以百分号 (%) 标记开始。
访问哈希元素格式${key}。
以下是一个简单的哈希实例
%data (google, google.com, runoob, runoob.com, taobao, taobao.com);print \$data{google} $data{google}\n;
print \$data{runoob} $data{runoob}\n;
print \$data{taobao} $data{taobao}\n; $data{google} google.com $data{runoob} runoob.com $data{taobao} taobao.com Perl 哈希 | 菜鸟教程 (runoob.com)