#break continue
my $i;
my $j;
for($i=0; $i<6; $i++){
print $i ."\n";
if($i == 3){last;} #last用来打断循环
#if($i == 3){next;} #next跳过这次循环,进入下一次循环
#if($i == 3){redo;} #redo执行他前面的代码
print $i ."\n";
}
#在内循环中对外循环进行操作需要借助标签
CODE:for($i=0; $i<3; $i++){
for($j=0; $j<3; $j++){
print "$i,$j \n";
if(($i == 3) && ($j == 3)){last CODE;} #last用来打断循环
}
}
#------------------上下文-----------------------
#标量上下文:表达式在标量上下文中返回一个标量
#列表上下文:期待表达式返回一个列表
my $a = 2*3; #2和3都是数字
print $a;
my $b = 2x3; #2是字符串3是数字
print $b;
#重要! 逗号和点的区别
#qw 相当于 ('' ,'' ,' ')
@arr = qw(abc efh hij);
print @arr,"\n"; # 返回:perlpythonshell 一整个列表
print @arr."\n"; # 返回:3 是元素个数
@arr=qw(perl python shell);
print "How many subject do you learn?\n";
print "I learn ",@arr," subjects!\n"; # 错误,这里会输出课程名称
print "I learn ".@arr." subjects!\n"; # 正确,这里输出课程数量
#使用scalar函数强制将列表上下文转换为标量上下文
print "I learn ",scalar @arr," subjects!\n"; # 正确,这里输出课程数量
@arr1=@arr; # 列表上下文,赋值@arr给另一个数组@arr1
$arr1=@arr; # 标量上下文,赋值@arr的元素个数给变量arr
#将数组赋值给标量变量,得到的是数组的长度(元素个数),
#将列表赋值给标量变量,得到的是最后一个元素,除了最后一个元素外,其它元素都被丢弃
@arr = qw(a b c d);
$x = @arr; # 将数组赋值给标量:4
$y = qw(a b c d); # 将列表赋值给标量 结果:$y=d,开启了warnings的情况下会警告
($y) = qw(a b c d); # 将列表赋值给标量 结果:$y=d,不会警告
($a,$b,$c,$d) = qw(a b c d); # 结果:$a=a,$b=b,$c=c,$d=d
#上下文中的<STDIN>
#@lines=<STDIN>;#如果把stdin赋值给数组,那么他会一直接收,直到用户按下ctrl+d作为eof
#foreach $val (@lines){
# print $val;
#}
#$line=<STDIN>;#如果把stdin赋值给一个标量,那么他只是接收一次
#print $line
#die 与 $!
$ok = open(FILE,"a.txt");
if(!$ok)
{
print "can't open file: $! \n" ;
#$!在字符串上下文中将会返回来自你的操作系统的相应的出错消息:
#die "can't open file: $! \n" ;#die是直接终止程序,不会有上面的任何信息
}
#也可使或逻辑+短路原理
#能打开myfile,die就不会执行,打不开die就会执行
#open(MYFILE, "myfile") || die "Cannot open myfile: $!/n";
#通常利用短路原理来找home
$home = $ENV{HOME} || $ENV{XXX} ||die "can not find!";
#所有地方都找不到就死掉吧 注:大括号是哈希$ENV是linux环境变量的哈希
print $home;
#注意!在perl中逻辑表达式的最终结果为最后一个标量的运算值,而不是布尔
$val = 2||3||3;
print $val; #结果是2 而不是"ture"
$val = 3 && 1 && 0;
print $val; #结果是0
$val = 3 && 0 && 6;
print $val; #结果是0
$val = 3 && 9 && 6;
print $val."\n"; #结果是6
#文件信息函数stat
$filename = "./a.txt";
@info = stat($filename);
print "@info"; #给打印的数组加双引会自动在各个元素中间加入空格
#得到数组info一共有13个元素
#1 dev :文件所属文件系统的设备ID
#2 inode :文件inode号码
#3 mode :文件类型和文件权限(两者都是数值表示)
#4 nlink :文件硬链接数
#5 uid :文件所有者的uid
#6 gid :文件所属组的gid
#7 rdev :文件的设备ID(只对特殊文件有效,即设备文件)
#8 size :文件大小,单位字节
#9 atime :文件atime的时间戳(从1970-01-01开始计算的秒数)
#10 mtime :文件mtime的时间戳(从1970-01-01开始计算的秒数)
#11 ctime :文件ctime的时间戳(从1970-01-01开始计算的秒数)
#12 blksize :文件所属文件系统的block大小
#13 blocks :文件占用block数量(一般是512字节的块大小,可通过unix的stat -c "%B"获取块的字节)