编辑代码

#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"获取块的字节)