本文主要为了方便阅读、编写perl脚本而记录的常用的命令、语法。
一、条件判断语法
注意,数字 0, 字符串 '0' 、 "" , 空 list () , 和 undef 为
false
,其他值均为
true
。 true 前面使用
!
或
not
则返回 false
语句描述
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
语句。它根据不同的值执行对应的代码块。
1.IF语句
if(boolean_expression){
# 在布尔表达式 boolean_expression 为 true 执行
#!/usr/bin/perl
$a=20;
if($a>=20){
printf "a 大于等于 20 \n";
printf "变量a的值为:$a\n"
2.IF...ELSE 语句
if(boolean_expression){
# 在布尔表达式 boolean_expression 为 true 执行
}else{
# 在布尔表达式 boolean_expression 为 false 执行
#!/usr/bin/perl
$a=10;
if($a>=20){
printf "a 大于等于 20 \n";
}else{
printf "a 小于 20\n";
printf "变量a的值为:$a\n";
输出结果:
3.IF...ELSIF...else 语句
if(boolean_expression 1){
# 在布尔表达式 boolean_expression 1 为 true 执行
elsif( boolean_expression 2){
# 在布尔表达式 boolean_expression 2 为 true 执行
elsif( boolean_expression 3){
# 在布尔表达式 boolean_expression 3 为 true 执行
else{
# 布尔表达式的条件都为 false 时执行
#!/usr/bin/perl
$a=10;
if($a>10){
printf "a 大于 10 \n";
}elsif($a=10){
printf "a 等于 10\n";
}else{
printf "a 小于 10\g";
printf "变量a的值为:$a\n";
4.switch 语句
use Switch;
switch(argument){
case 1 { print "数字 1" }
case "a" { print "字符串 a" }
case [1..10,42] { print "数字在列表中" }
case (\@array) { print "数字在数组中" }
case /\w+/ { print "正则匹配模式" }
case qr/\w+/ { print "正则匹配模式" }
case (\%hash) { print "哈希" }
case (\&sub) { print "子进程" }
else { print "不匹配之前的条件" }
#!/usr/bin/perl
use Switch;
$var = 10;
@array = (10, 20, 30);
%hash = ('key1' => 10, 'key2' => 20);
switch($var){
case 10 { print "数字 10\n" }
case "a" { print "字符串 a" }
case [1..10,42] { print "数字在列表中" }
case (\@array) { print "数字在数组中" }
case (\%hash) { print "在哈希中" }
else { print "没有匹配的条件" }
5.三元运算
Exp1 ? Exp2 : Exp3;
#!/usr/bin/perl
$a=1>2?false:true;
print "$a\n"
二、循环语句语法
循环类型描述
while 循环
当给定条件为 true 时,重复执行语句或语句组。循环主体执行之前会先测试条件。
until 循环
重复执行语句或语句组,直到给定的条件为 true。 循环主体执行之前会先测试条件。
for 循环
多次执行一个语句序列,简化管理循环变量的代码。
foreach 循环
foreach 循环用于迭代一个列表或集合变量的值。
do...while 循环
除了它是在循环主体结尾测试条件外,其他与 while 语句类似。
您可以在 while、for 或 do..while 循环内使用一个或多个循环。
1.while循环
while(condition)
statement(s);
#!/usr/bin/perl
$a = 10;
while( $a < 20 ){
printf "a 的值为 : $a\n";
$a = $a + 1;
2.for循环
for ( init; condition; increment ){
statement(s);
#!/usr/bin/perl
for( $a = 0; $a < 10; $a = $a + 1 ){
print "a 的值为: $a\n";
3.循环控制语句
控制语句描述
next 语句
停止执行从next语句的下一语句开始到循环体结束标识符之间的语句,转去执行continue语句块,然后再返回到循环体的起始处开始执行下一次循环。
last 语句
退出循环语句块,从而结束循环
continue 语句
continue 语句块通常在条件语句再次判断前执行。
redo 语句
redo 语句直接转到循环体的第一行开始重复执行本次循环,redo语句之后的语句不再执行,continue语句块也不再执行;
goto 语句
Perl 有三种 goto 形式:got LABLE,goto EXPR,和 goto &NAME。
三、perl运算符
1.算数运算符
运算符描述实例
$a + $b 结果为 30
$a - $b 结果为 -10
$a * $b 结果为 200
$b / $a 结果为 2
求余运算,整除后的余数
$b % $a 结果为 0
$a**$b 结果为 10 的 20 次方
2.比较运算符
运算符描述实例
检查两个操作数的值是否相等,如果相等则条件为 true,否则为 false。
($a == $b) 为 false
检查两个操作数的值是否相等,如果不相等则条件为 true,否则为 false。
($a != $b) 为 true。
检查两个操作数的值是否相等, 如果左边的数小于右边的数返回 -1,如果相等返回 0, 如果左边的数大于右边的数返回 1 。
($a <=> $b) 返回 -1。
检查左操作数的值是否大于右操作数的值,如果是则条件为 true,否则为 false。
($a > $b) 返回 false。
检查左操作数的值是否小于右操作数的值,如果是则条件为 true,否则返回 false。
($a < $b) 返回 true。
检查左操作数的值是否大于或等于右操作数的值,如果是则条件为 true,否则返回 false。
($a >= $b) 返回 false。
检查左操作数的值是否小于或等于右操作数的值,如果是则条件为 true,否则返回 false。。
($a <= $b) 返回 true。
#!/usr/bin/perl
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime();
printf("格式化时间:YYYY-mm-DD HH:MM:SS\n");
printf("%04d-%02d-%02d %02d:%02d:%02d\n",$year+1900,$mon+1,$mday,$hour, $min, $sec);
2)通过POSIX 函数 strftime()格式化时间输出
#!/usr/bin/perl
use POSIX qw(strftime);
$datestring = strftime "%Y-%m-%d %H:%M:%S", localtime;
printf("时间日期 - $datestring\n");
3.POSIX 函数 strftime()格式
符号描述实例
星期几的简称( Sun..Sat) *
星期几的全称( Sunday..Saturday) *
Thursday
月的简称(Jan..Dec) *
月的全称(January..December) *
August
日期和时间 *
Thu Aug 23 14:55:02 2001
年份除于100,并取整 (00-99
)
一个月的第几天 (01-31
)
日期, MM/DD/YY
相等于%m/%d/%y
08/23/01
一个月的第几天,使用空格填充个位数 ( 1-31
)
YYYY-MM-DD
的简写类似于 %Y-%m-%d
2001-08-23
年份的最后两位数 (00-99
)
月的简称 * (和%b
选项相同)
24 小时制 (00-23
)
12 小时制 (01-12
)
一年的第几天 (001-366
)
月 (01-12
)
分钟 (00-59
)
新行 ('\n'
)
显示出AM或PM
时间(hh:mm:ss AM或PM),12小时 *
02:55:02 pm
24 小时 HH:MM
时间格式,相等于 %H:%M
14:55
秒数 (00-61
)
水平制表符 ('\t'
)
时间(24小时制)(hh:mm:ss),相等于%H:%M:%S
14:55
ISO 8601 的星期几格式,星期一为1
(1-7
)
一年中的第几周,星期天为第一天(00-53
)
ISO 8601 第几周 (00-53
)
一个星期的第几天(0代表星期天) (0-6
)
一年的第几个星期,星期一为第一天 (00-53
)
显示日期的格式(mm/dd/yy) *
08/23/01
显示时间格式 *
14:55:02
年,两位数 (00-99
)
ISO 8601与UTC的时区偏移(1 minute=1, 1 hour=100)
当前时区的名称,如"中国标准时间" *
五、perl中$组合含义
$! 根据上下文内容返回错误号或者错误串
$” 列表分隔符
$# 打印数字时默认的数字输出格式
$$ Perl解释器的进程ID
$% 当前输出通道的当前页号
$& 与上个格式匹配的字符串
$( 当前进程的组ID$) 当前进程的有效组ID
$* 设置1表示处理多行格式.现在多以/s和/m修饰符取代之.
$, 当前输出字段分隔符
$. 上次阅读的文件的当前输入行号
$/ 当前输入记录分隔符,默认情况是新行
$: 字符设置,此后的字符串将被分开,以填充连续的字段.
$; 在仿真多维数组时使用的分隔符.
$? 返回上一个外部命令的状态
$@ Perl解释器从eval语句返回的错误消息
$[ 数组中第一个元素的索引号
$\ 当前输出记录的分隔符
$] Perl解释器的子版本号
$^ 当前通道最上面的页面输出格式名字
$^A 打印前用于保存格式化数据的变量
$^D 调试标志的值
$^E 在非UNIX环境中的操作系统扩展错误信息
$^F 最大的文件捆述符数值
$^H 由编译器激活的语法检查状态
$^I 内置控制编辑器的值
$^L 发送到输出通道的走纸换页符
$^M 备用内存池的大小
$^O 操作系统名
$^P 指定当前调试值的内部变量
$^R 正则表达式块的上次求值结果
$^S 当前解释器状态
$^T 从新世纪开始算起,脚步本以秒计算的开始运行的时间
$^W 警告开关的当前值
$^X Perl二进制可执行代码的名字
$_ 默认的输入/输出和格式匹配空间
$| 控制对当前选择的输出文件句柄的缓冲
$~ 当前报告格式的名字
$` 在上个格式匹配信息前的字符串
$’ 在上个格式匹配信息后的字符串
$+ 与上个正则表达式搜索格式匹配的最后一个括号
$< 当前执行解释器的用户的真实ID
$ 含有与上个匹配正则表达式对应括号结果
$= 当前页面可打印行的数目
$> 当前进程的有效用户ID包含正在执行的脚本的文件名
$ARGV 从默认的文件句柄中读取时的当前文件名
%ENV 环境变量列表
%INC 通过do或require包含的文件列表
%SIG 信号列表及其处理方式
@_ 传给子程序的参数列表
@ARGV 传给脚本的命令行参数列表
@INC 在导入模块时需要搜索的目录列表
$-[0]和$+[0] 代表当前匹配的正则表达式在被匹配的字符串中的起始和终止的位置
六、perl中参数传递
Getopt::Std模块的功能: 初始化perl命令行中所接受的参数,简化了命令行参数的解析
※参数类型:整数, 浮点数, 字串
GetOptions( ‘tag=s’ => \$tag );
=表示此参数一定要有参数值, 若改用’:'代替表示参数不一定要有参数值
s表示传递字串参数, 若为i表传递整数参数, 若为f表传递浮点数
=>表示参数值传递给变量$tag,最终参数值可通过$tag获取
#!/usr/bin/perl
use Getopt::Long;
GetOptions ("parameter=s" => \$parameter);
print "$parameter \n";
执行结果:perl pl01.py -parameter 输入参数值 或者perl pl01.py -parameter=输入参数值