if
格式(类似于awk):if(表达式){ #空格可以忽略
语句 ;} #elsif注意多了个s,elsif和else可以省略
elsif(表达式){ #语句块的{}必须有,可以为空
语句:}
else{
语句;}
unless
格式:unless (表达式){
语句;}
while
格式:while(表达式){
语句;}
do while
格式:do {语句} while(表达式)
until
格式:until(表达式){
语句;}
do until
格式:do {语句} until(表达式)
for foreach
for和foreach等价可以互换
格式:
c语言风格for(表达式1;表达式2;表达式3){
语句;}
表达式可以省略分号必须保留:(;;)为死循环for($l=<>,$count=1;$count<10;$count++,$l=<>){
print "$l";}
foreachforeach $w (列表or数组){
语句;}
()中为@array或者列表(1,2,3)
$w为循环体的局部变量,并不会影响外部同名变量
循环体每次取数组或列表的元素直到为空
修改$w会修改对应元素的值;$w是列表数组元素的一个引用,与列表或数组变量引用具有相同内存地址,所以修改$w会修改其对应元素的值
列表中为常量,$w不可改变,$w只是对数组列表元素的一个引用,$w赋值时,$w指向新的内存对象,原列表中的值并不改变for $a(@a){}
for $a(1,2,3){}
for $k(keys%h){}
for $a(@a[1,2]){}
for (@a){} #省略循环变量,缺省为$_
grep,map函数相当于for每个元素进行操作
循环控制
last 退出循环
next 执行下一次循环
redo 重新执行本次循环,for自增不进行,do语句中无效
goto 跳转,不能跳到循环或者子程序内
标记:
字母加下划线,通常用大写,以:分隔
标记定义:在循环语句前或者语句前(goto)
while for
跳转到标记: last|next|redo|goto labelOUT: while (...){
while(...){...
last OUT; #跳转到OUT标识的语句块,这里是跳出这一层循环到外层循环
}
}
continue{语句}
跟在循环语句后,循环体执行完成,下一次条件判断前执行
{}标识语句块
last跳出后不执行,next执行;
单行条件语句与循环语句print $a if $a==0;#先判断条件在执行打印
print $a unless($a==0);
print $a while ($a==0);
#不要丢失对变量控制,防止形成死循环
print $a while ($a--==0);
print $a until ($a--==0);
|| && (用法同shell)$a==0 && print $a;
open(FD6,'file')||die "can't open file";#die函数,输出标准错误输出后推出
warn:输出信息后不退出,只是报警
$! :内部变量包含错误代码
$@ :内部变量包含错误信息