Perl笔记

参考

http://itboba.com/category/2/188/217   ITBoBa perl视频教程

《Perl实例精解 Perl by Example》

http://www.regexlab.com/zh/regref.htm   揭开正则表达式的神秘面纱
 
 
http://www.activestate.com/  含ActivePerl安装文件(Unix及一些软件内置了Perl,windows没有,需要安装ActivePerl)
www.cpan.org  含有perl的文档,模块等很多资料
www.chinaunix.net >开发>Perl 

 

应用、工具

Perl的开发者:Larry Wall,1987-12-18
主要特点:文本处理功能强大,灵活和复杂的正则表达式,除专有模块,大多数平台都能运行
perl的应用:web编程(CGI,XML处理)、系统管理、网络编程(安全脚本)、数据库管理、图像处理 、其他

编辑工具:NotePad, Ultra-Edit, PerlEditor, PerlIDE

 
Ultra-Edit>高级>工具配置:工作目录&p

Perl运行:../Perl/bin/perl.exe -w "%f"

Perl编译:../Perl/bin/perl.exe -w -c "%f"

Perl调试:../Perl/bin/perl.exe -w -d "%f"

 
perldoc win32  命令行查看模块文档

变量和常用函数

简单变量scalar (标量) $开头,可以用$(var)表示,变量名区分大小写,没有关键字,但是不能和内置变量重复。
注释#, 结尾用";",语句块用{}
数组@开头,Hush %开头,文件用大写 
脚本第一行#! /user/bin/perl 表示脚本由perl解释执行。
  1. 字符串表示
  • $a="hello";  字符串用单引号'hello',双引号"hello",qq(hello),q(hello)都可以.
  • " " --- 变量替换,转义,用前置/表示特殊字符$ ' " /. print "$string/n" 如果变量$str和$string都有,将按最长匹配,即匹配$string.
  • ' ' --- 变量不替换,不转义,前置/只用于' /
  • q   --- 代替单引号
  • qq --- 代替双引号,
  • 如print q($a/n) 输出"$a/n" ,如果换成qq, 将输出$a的值后换行
  • q/qq后面的()可以用{},[],<>  //  ;;  !!替换。括号内的特殊字符不需要用"/"转义。
  • 转义字符:/n换行,/r回车(从行尾跳到行首), /a 响铃, /b 退格, /e ESC, /t 横向跳格TAB, /v纵向跳格, /cn CTRL+n, /f 换页
  •        /l下一个字符是小写,/u 下一个字符是大写, /L后面都是小写,直到/E, /U后面都是大写,直到/E, /Q不查找模式匹配字符,直到/E
  •        /nnn八进制表示的ASCII码,/xnn十六进制表示的ASCII码
  •  
  • 字符串函数
  • length($s), lc/uc 转成全小写/大写, ucfirst,lcfirst, pos
  • index, rindex
    • index查找某子串位置,从0开始计数。rindex是从右边开始查找
    • position = index (string, substring, position)
      返回子串substring在字符串string中的位置,如果不存在则返回-1。参数position是可选项,表示匹配之前跳过的字符数,或者说从该位置开始匹配。
  • substr
    • substr (expr, skipchars, length)
      抽取字符串(或表达式生成的字符串)expr中的子串,跳过skipchars个字符,或者说从位置skipchars开始抽取子串(第一个字符位置为0),子串长度为length,此参数可忽略,意味着取剩下的全部字符。
      当此函数出现在等式左边时,expr必须为变量或数组元素,此时其中部分子串被等式右边的值替换。

      substr() 函数的作用有两个:替换一部分子串。 删除一部分子串。

    • $string = "This is what you have";
      $first = substr($string, 0, 1); # "T"
      $start = substr($string, 5, 2);
      # "is"
      $rest = substr($string, 13);
      # "you have"
      $last = substr($string, -1);
      # "e"
      $end = substr($string, -4);
      # "have"
      $piece = substr($string, -8, 3);
      # "you"
  • $a.$b ----字符串连接
  • 'a' x 5 --- 'aaaaa', x表示重复,前后必须有空格,如果重复次数小于1,得到空串
  • chop(str) ---str变量直接截去最后一个字符。注意是这个变量直接变了,而不是变了或赋给另一个变量
  • chomp(str) ---str变量直接截去末尾的行分隔符,默认分隔符是/n,可以用 $/定义。如果$/="",chomp将截去所有换行符
  • ubstr($string, $offset, $count);
    1.  数值表示
    • 运算符:$a**$b ---- a^b,其他运算符 +, -, *, /, %(取余), ++, --, -$a, 字符串参加运算会自动转换
    • 函数:$a = Int(5.5)   ---- 5   Int取整,rand(5) 0-5的随机数, srand, sin, sqrt,
    • 5_555_555   --------下划线不会编译,只是为了方便阅读
    • .3=0.3, 3.=3.0
    • 八进制:以0开头,027=23
    • 十六进制:以0x开头,0x27=39
    • 整数最长15位,指数范围-309 ~ 308
     
    1. $a=<>;  <>表示从键盘输入
    2.  输出

    print "$a/n";  #打印用print

    $_ = "Hello";

    print ;   #输出时如果没有指定输出值,就输出$_变量值

    1.  转换函数:ord, chr, pack, unpack
    2. 变量没有创建 undef($a)
      1. 将一个变量声明为未定义
      2. 用在条件判断中
      3. 代替不关心的变量
      4. 到达文件尾
      5. 可以用#! /user/bin/perl -w 提示undef变量
                    $s="a:b:c:d";
                    ($a1,undef,undef,$d1)=split(/:/,$s);
    1. 变量已经创建defined,用在条件判断中: if(defined($a)) 
    2. 数值变量初值为0,字符串变量初值为空串   

    运算符

    1. 位运算符:&, |, ~, ^, <<, >>
    2. 赋值运算符:=, +=, -=, *=, /=, %=, **=, &=, |=, ^=, .=  可以连等$a=$b=3;
    3. 自增++, 自减--,字符串可以自增,不可以自减, $a="az"; $a++; $a变成"ba"
    4. ","逗号运算符,两个语句关联紧密时可以用逗号连接,将语句写在一行
    5. 条件表达式: 条件?真:假,$result=$var==0?14:7===>条件为真,$result赋值14,为假,赋值7; &a==43?$var1:$var2=14; ===>条件为真, $var1=14, 条件为假,$var2=14
    6. 数值比较: <, >, ==, <=, >=, !=, <=>. $a<=>$b  ---a>、=、<b,分别返回1、0、-1
    7. 字符比较:lt, gt, eq, le, qe, ne, cmp。比较顺序按照ASCII码顺序,数字<大写<小写,从左往右比较,空串"",空列表, 0,undef定义为假
    8. 逻辑比较:&& (and), || (or), ! (not), xor
    9. 运算符优先级: ++ --最高,单运算符高于多运算符,数字》比较》位》赋值》逻辑. 其中数字幂》* /》+-. 比较运算符> <高于==, !=

    控制结构

    1.  Perl没有Switch语句
    2. Exit 0; 退出Perl
    3.  条件
      1. if(执行条件) {} elsif() {} else {} ; 注意elsif 没有"e",{}必须有,但可以为空。elsif和else都可以没有
      2. unless(退出条件){}
    4. 循环:
      1. while($i<10){last if($i==5);$i++;}
      2. do {} while(执行条件) 至少执行一次
      3. until(执行条件){}
      4. do{} until(退出条件)
      5. for($i=2;$i<10;$i++){}。last退出当前循环
      6. foreach $c(@a) {}

      7. foreach $c(@a[1,2]) {} 访问部分元素

      8. foreach (@a) {print  "$_"}  $_循环变量的缺省值

      9. foreach ($i=2;$i<10;$i++){} 与For通用

    5. 循环控制
      1. last 退出循环
      2. next 进到下一次循环
      3. redo 重新执行本次循环,在do语句中失效
      4. goto 不能跳转到循环或子程序内
      5. label:标记,last/next/redo/goto后都可以使用,一般用大写加:
        1. 循环语句后可以用continue{}:last跳出后continue不执行,next会执行

        OUTER: while()

        {

            INTER: while()

            {

                last OUTER;  #中止外层循环

            }

        }

    1.  单行语句:语句+条件

      1. print $a if $a==0;  条件if、unless、while($a--==0)、until($a--==0)

      2.  $a==0 && print $a;

      3. open(F,"file") || die "can't open file";  die 报错后退出程序, warn报错后不退出程序,$!内部变量 包含错误代码,$@内部变量 包含错误信息

    列表和数组

    1. 列表:
      1. (1,"Hello",3.5),列表元素可以用空格或逗号隔开,可以是单元素列表,列表也可以是空的
      2. qw(a b c d), qw(a,b,c,d)=('a','b','c','d')   qw是字符串列表,里面元素不需要用引号, 和qq类似
      3. (1..5, 11..15) ..表示范围运算符。
        1. 元素从左边开始增1,直到小于右边值,(2.4..5.3) ==>(2.4,3.4,4.4)。
        2. 如果右边小于左边(4.5..1.6),则为空。
        3. ("aa".."ad") ==>("aa","ab","ac","ad")
        4. ($a..$a+3)
        5. @month=("01".."31")
      4. $a=(1,2) ==>$a取列表最右边值,即2
    2. 数组
      1. 创建数组:
        1. @array=qw(a, b, c, d); 
        2. ($a,$b,$c)=qw(a,b,c);
        3. @b=(1,@a,4);
        4. @c=('a') x 4; (4个元素都是'a')
        5. @a=<>; 从键盘输入,ctrl+d结束
        6. @a=(1,2,3,4); $a[5]=6; 数组自动变成6个元素,中间空的元素为NULL
      2. 取出元素:
        1. $array[index]  单个元素,index从0开始
        2. @array[index1,index2,...]  取部分元素
        3.  $#array  最后一个元素的index,$array[$#array] 最后一个元素
        4. $array[-1] 最后一个元素,-1表示从后开始取第1个。
        5. $array[0]表示元素,而"$a/[0]","$a{a}[0]","$/{a}[0]"表示字符串
      3.  遍历数组
        1. for($index=0; $index<@array; $index++)
        2. foreach $number(@array)
        3. print @found;  元素相连输出
        4. print "@found"; 元素之间用空格连接输出
      4. 元素交换:@a[1,2]=@a[2,1]
    3. 数组函数
      • sort 排序
        • sort {代码块}或函数名 (@array)
        • 缺省代码块,表示按字母顺序排序
        • 用$a,$b代表数组元素,@_代表数组
        • @a=(1,12,4,8,20)
        • sort(@a) ---字母顺序排序 1,12,20,4,8
        • sort {$a<=>$b} (@a); ----数字顺序排序,1,4,8,12,20
      • reverse @array 将数组倒序,即最后一个元素变成第一个
      • chop @array 每个元素截去最后一个字符
      • chomp @array 每个元素截去末尾行分隔符
      • shift(@array); 删除数组第一个元素,返回删除的元素。缺省对@ARGV数组
      • unshift(@a,$b); 在数组开头增加元素,返回新数组长度
      • push(@a,$a); 在数组末尾增加元素
      • pop(@a); 在数组末尾删除元素
      • Join 把数组元素连接成一个字符串
        • Join('连接字符',@a)
        • Join('连接字符','a','b')
        • print join(" ", sort(@array));  join 将数组元素用" "分隔,然后输出
      • Split分割字符串
        • @a=split(/模式/,分割字符串,长度)
        • 模式:缺省为空格,可以省略
        • 分割串:缺省为$_,可省略
        • 长度:可省略,表示全部分割。
        •  $s="a-b-c"; @a=split(/-/,$s,2); ==>@a=('a','b-c')
      • wantarray(),判断是要返回数组还是简单变量
        • sub mysub(){ print wantarray()?"数组/n":"变量/n";}
        • @a=mysub();
        • $b=mysub();
      • splice 数组部分元素替换
        • @ret=splice(@a,skip,length,@newlist)
        • 对@a操作,跳过skip个元素,然后开始用@newlist替换length个元素
        • @newlist和length可以不等长,无论@newlist多长,它替换length长的元素位置
        • 当length=0时为插入。splice(@a,-1,0,@n)在末尾追加
        • 当@newlist为空时则为删除
        • 当length和@newlist省略时为其后的全部删除,如splice(@a,3) 保留前3个元素
      • grep 搜索字符
        • @found=grep(/pattern/,@search)
        • 对@search的每一个元素搜索匹配模式,匹配的元素返回到@found数组中
      • map 对每个元素($_)进行运算, 返回运算后的数组
        • map(expr,@list)
        • map($_+1,(1,2));  ==>(2,3)
    4.  二维数组 $aoa=[[1,2,3],['a','b','c']]; 引用地址
      • @{$aoa->[0]}  子数组访问
      • @($aoa->[0]} [0,1]  子数组元素列表
      • $aoa->[0][0] 元素访问
      • $aoa=[[@a],[@b]]; 两个数组组成一个二维数组,里面的[]不能省略
    5. 关联数组,Hash,哈希,散列
      1. 概念:元素内容与位置有关,元素下标变成任意简单变量,实现通过简单变量访问元素值
      2. 原理:分散存储,通过一个函数(散列函数)把位置值简单变量转换成分散的另外的值,按该值存储
      3. 特点:1)有的位置可能无值,用空间换取时间; 2)数组内容没有顺序;3)对查找单个值,比数组慢,但比链表快
      4. $wordcount{$word}++; 对英文中每个单词计数
      5. 关联数组可以模拟数据结构:链表,结构,树,二维表
      6. Hash表示
        • %h=('a',1,'b',2);   %h=('a'=>1,'b'=>2); key和value成对出现
        • %开头,()为空散列,'a''b'称为关键字key,由key得到的为值Value,Key的引号省略时自动认为是字符串
        • 元素形式:$hash{'a'}; $h{2.5}, $h{-1}, $h{$k}
      7. Hash赋值
        • %h= @a  如果数组@a是成对的
        • @a=%h  数组元素的顺序是随机的
        • %h1=%h2
        • ($a,%h)=@array
        • %h=(%first,%second); 浪费内存
        • %h1=(%h2,'k','v') 增加一组键值
        • %h=split(); 函数返回作为散列
        •  获取散列片断:@keys=('a','b','c'); @hash{@keys}=@hash{reverse(@keys)};
        •  $hash{@keys} ==>$hash{3}
        • %h=(a=>1,b=>3); print "%h/n"; ==>%h
        • print %h; ==> a1b3
        • $a=%h; print "/n$a/n"; ==> 2/8 产生8对,已经赋值的2对
      8. 散列操作函数
        • keys(%h) 返回键列表的数组;
        • values(%h)返回值列表的数组
        • ($key,$value)=each(%hash) 取出键值对,最后返回undef
        • exists $h{'key'} 是否存在对应值
        • Undef(%h) 删除散列,相当于%h=();
        • delete $h($k)
        •  foreach $word(keys(%list)){last if ($word == "second");}
        • Tie::IxHash模块
        • %hash=reverse %h; 键值互换

    模式匹配-正则表达式regular expression

    1. 3种形式:
      1. 匹配 m/<regexp>/, m/perl$/表示判断字符串末尾是否为perl
      2. 替换 s/<pattern>/<replacement>/
      3. 转化 tr/<pattern>/<replacement>/  如大小转小写
    if($cmd=~ m/xxx/)       #如果$cmd中含有xxx,用excutecount代替. =~ 匹配;!~不匹配

     {

      $cmd=~ s/xxx/$excutecount/g;   #注意:替换后变量$cmd就变了

      print "$atcmd/n";

     }
    1. 字符匹配
      • +  一个或多个相同的前导字符,/d[eE]+f/  匹配 deE, dee, dEE, dEe,deee, 匹配多个e或E,相当于/d[eE][eE][eE]/ 
      • *  匹配0个、1个或多个相同字符
      • ?  匹配0个或1个前一字符
      • .   匹配除换行以外的所有单个字符(当模式选项不用s时)
      • .* 匹配所有任意数量字符,相当于.....
      • {} 匹配指定数目的字符,如/de{1,3}f/ 1-3个e,  /de{3}f/,  /de{3,}f/ 大于等于3个e,  /de{0,3}f/
      • 贪婪规则:尽量匹配尽可能多的相同字符
        • $_ = "axxxcxxxcxxxd";
        • /a.*c.*d/   .*会和第二个c之前的所有字符符合 * + ?都是贪婪的
        • /a.*?c.*d/  重复符合后加上? 可以让它变得不贪心, 和最少的a,c之间字符匹配
      • 懒惰规则: 模式匹配只要找到一个就停止,不再继续匹配
    2. 选择匹配
      • [abc] 匹配abc其中之一
      • [^dEf] 匹配dEf之外的字符,主要^在[]之间
      • [0-9][a-z][A-Z], [0-9a-zA-Z] 匹配任意字母或数字, /d也表示数字
      • |匹配两个或多个模式之一,/def|ghi/ 匹配def或者ghi, /x|y+/ 匹配x或y+
      • 例:检验数字合法性 $number =~ /^-?/d+$|^-?0[xX][/da-fA-F]+$/  十进制或十六进制0x, -?有-或者没有,/d+$以数字结尾
    3. 转义符
      • /*, //, /?
      • /Q开始到/E间的字符为原始字符,无特殊含义
      • /d  任意数字,[0-9]
      • /D 除数字外的任意字符[^0-9]
      • /w 任意单词字符 [0-9a-zA-Z]
      • /W 任意非单词字符 [^_0-9a-zA-Z]
      • /s 空白 [ /r/t/n/f]
      • /S 非空白  [^ /r/t/n/f]
    4. 定界符,锚
      • ^  /A 仅匹配字符串首
      • $   /Z仅匹配字符串尾
      • /b 匹配单词边界, /def/b/匹配以def结尾的字符串,//bdef/匹配以def开头的字符串
      • /B 单词内部匹配,/def/B/匹配defghi等def不在右边界的字符串, //Bdef/B/ 只匹配def在中间的字符串 
    5. 模式的重用和模式变量:
      • 当模式中匹配相同的部分需要出现多次试,用()将第一次出现的括起来,随后要用时用/n代表第n个()的值。模式外要引用时用$n表示
        • //d{2}([/W])/d{2}/1/d{2}/ 匹配 12-05-92, 26.22.34等,不匹配12-05.45,因为()把值记录下来,后面的/n值必须是一样的
        • /(/d{2})([/W])/1/2/1/ 匹配17-17-17,不匹配12-05-34
      • 模式变量
        • $string="This is a number 25.11."; $string =~ /-?(/d+)/.?(/d+)/;
        • $n --- 匹配后代表重用部分  $1 = 25; $2= 11
        • $& --- 符合模式匹配的字符串    $& = 25.11
        • $` --- 符合模式匹配的字符串之前的字符串  $`="This is a number "
        • &' --- 符合模式匹配的字符串之后的字符串  $' = "."
        • @result =~ /-?(/d+)/.?(/d+)/  $1,$2赋值给数组
        • ($m1,$m2)=($name =~ /(ab)*(c)/)
      • 如果匹配失败,$1的内容不确定,可能是从前匹配的内容。为避免失败,要进行判断或用上例10直接赋值
      • 嵌套使用 /((aaa)*)/  最外层为$1
    6. 匹配选项  //后的字符:
      1. g 多次匹配 global
        • g 匹配所有可能的模式, 返回到数组中. @matches ="balata" =~ /.a/g; ---> @matches = ("ba","la","ta")
        • while("balata" =~ /.a/g)  {$match = $&; print ($match/n";}
        • 当使用了选项g时,可用函数pos来控制下次匹配的偏移:$offset = pos($string); pos($string) = $newoffset;
      2. i   忽略模式中的大小写
      3. m  将待匹配串视为多行,^匹配字符串起始或新的一行的开始,$匹配任意行的末尾
      4. s   将待匹配串视为单行,.可以匹配/n   /a.*bc/s 将匹配字符串axxxx/nxxxbc,但/a.*bc/则不匹配该字符串
      5. o   循环结构中,模式仅执行一次变量替换, $var=1; $line = <STDIN>; while($var < 10) {$result = $line =~ /$var/o;$line = <STDIN>; $var++;}
      6. x 忽略模式中的空白,主要为了使模式看起来格式清晰
    7. 匹配符合的优先级:() --> + * ? {}出现次数 --> ^ $ /b /B  位置 --> | 选项
    8. 扩展匹配模式(?<c>pattern)
      1. (?:pattern)  不存储括号内的匹配内容。/(?:a|b|c)(d|e)f/1/   /1表示已匹配的d或e,而不是a|b|c
      2. /(?option)pattern/内嵌模式选项,option有四个: i m s x 可以内嵌使用。/(?i)[a-Z]+/ = /[a-Z]+/i
      3. (?#注释) 模式内的注释. if($string =~ /(?i)[a-Z]{2,3}(?#match two or three alphabetic characters)/ )
      4. (?) 取消贪婪,*?  +?  ??  {x}?   {x,}?   {x,y}?  例"a12b38b"  /a.*b/ 全部匹配,当/a(.*?)b/ 匹配a12b.
      5. /pattern(?=string)/   /pattern(?!string)/ 匹配后面为(不为)string的模式,且模式指针的位置仍保留在string之前
        • $string = "25abc8"; $string =~ /abc(?=[0-9])/; &matched = $&  --> abc,不是abc8
        • $line = "block 1 first block 2 second block3 third"; $line =~ /block/d(.*?)(?=block/d|$)/g; print $1;
        • $line = "begin <data1> begin <data2> begin <data3>"; while($line =~ /begin(.*?)(?=begin|$)/sg) {print $1;}
    9. 替换操作 s/pattern/replace/
      1. 替换部分可使用模式变量$n, 如s/(/d+)/[$1]/
      2. 替换部分不支持模式的特殊字符,如{},*,+等
      3. 替换操作符的选项 g i m o s x e
        1. e 将replace看做表达式,替换之前先计算其值
        2. $string = "0abc1"; $string =~ s/[a-zA-Z]+/$& x 2/e;  ---> $string = "0abcabc1"
    10. 翻译操作 tr/string1/string2/
      1. string1的第一个字符替换为string2的第一个字符,依此类推
      2. string1比string2长时,其多余字符替换为string2的最后一个字符
      3. string1中同一个字符出现多次时,将使用第一个替换字符
      4. 翻译操作符的选项
        1. c 翻译所有未指定字符,$string =~ tr//d/ /c; 把所有非数字字符替换为空格
        2. d 删除所有指定字符,$string =~ tr//t //d; 删除tab和空格
        3. s 把多个相同的输出字符缩成一个, $string =~ tr/0-9/ /cs;  把数字间的其它字符替换为一个空格
    11. m指定模式定界符,默认为/
      1. 用特殊字符做模式定界符时,模式内的该字符转义功能或特殊功能不能使用
      2. 成对的符号必须成对的使用,如 s(aa)(bb)sg
      3. m!/u/jpublic/perl/prog1!  等价于///u//jpublic//perl//prog1/
      4. quotemeta('ab') = /a/b自动加反斜杠
      5. 类似程序块的匹配形式
        1. $line =~ s{  #replace
                                                /#    #a pound sign
                                                (/w+)  #the variable name
                                              }
                                              {
                                                    ${$1}
                                               }xg

     

    $line =~ /^/QDuration(s):/E ?(/d+/.?/d+|/d+)/i)    匹配正小数
    $line =~ s/^/QDuration(s):/E ?//             将"Duration(s) 去掉,留下数字

     文件操作

    1.  open(HANDLE,">filename")||die $!; 成功返回非零,失败返回0
      1. 文件描述符(代表文件的数字)和文件句柄(文件变量):
        1. 句柄转化成描述符:fileno(F);
        2. 描述符转化成句柄:open(F,">&n");
        3. 文件句柄:以字母开头,由字母、数字和下划线组成,不能以$,@,%类符号开头,为避免与关键字重名,一般用大写字母
        4. 缺省打开的句柄STDIN,STDOUT,STDERR, 文件描述符0,1,2.不用调用open就可以直接访问
        5. STDIN: 键盘输入,控制台;STDOUT: 屏幕,显示屏;STDERR:错误输出,显示屏
      2.  访问模式,open第二个参数,
        1. 只读: open(F,"file"); open(F,"<file")
        2. 只写: >  不存在则创建,存在则覆盖, +>读写
        3. 追加: >> 不存在则创建,存在则追加,+>>读写
        4. 读写: +< 不存在则失败,存在则覆盖
        5. 管道: |  open(F,"|cat>hello"); 把F的输出作为|后的输入。open(F,"comm|"); 把comm的输出作为F的输入
      3. 文件名:
        1. 注意特殊的文件名(含特殊字符><等)可能使读变成写,因此要注意过滤
        2. open(F,">&STDOUT); 写入F文件的内容都变成写入屏幕
        3. open(F,">&3); open(F,">&=3") 文件描述符复制成句柄
      4. die($errstr) or warn($errstr)
        1. die 向STDERR输出指示错误信息的串,然后退出程序
        2. warn 只输出信息,不退出程序
        3. $!最后一次错误的信息,和die warn结合使用
        4.  die($str)中$str最后不是/n时,输出自动添加 "at 程序名 line 行号"。
    2.  close(F)
      • 重新打开已经打开的文件,先关闭再打开
      • 程序退出时自动关闭
      • 关闭时才开始真正写文件,一般将文件内容先写到称为文件缓冲区的内存中,缓冲满时才写入磁盘。
      • $|变量决定是否有文件缓冲,$|=1无缓冲,只对当前输出文件有效。对其他文件,要先用select(F)。select(F)设置当前文件,返回原文件句柄。设置完再select(OLD)返回原文件。
    3. 文件缓冲
      •                     缓冲                          无缓冲
        • 打开:open,sysopen          sysopen
        • 关闭:close
        • 读:   <>,readline              sysread
        • 写:     print                     syswrite
        • 定位:   tell, seek                 sysseek
    4.  其他文件打开函数
      • 间接文件变量:$a="F"; open($a,"mode","path");
      • sysopen(H,name,m|o|d|e,pri); 
        • 模式mode: O_RDONLY, O_WRONLY,O_RDWR,O_CREAT,O_EXCL,O_APPEND, O_TRUNC, O_NONBLOCK,O_SHLOCK, O_EXLOCK,O_BINARY,O_NOCTTY, O_SYNC
        • 权限pri: 类似unix 0755的数字
      • IO模块: $fh=IO::File->new(">$f"); new($f,O_WRONLY); new($f,"r+“);
        •  <  RDONLY   "r"
        • > WRONLY|TRUNC|CREAT "w"
        • >> WRONLY|APPEND|CREAT "a"
        • +< RDWR  "r+"
        • +> RDWR|TRUNC|CREAT  "w+"
        • +>> RDWR|APPEND|CREAT "a+" 
    5. 读文件
      1. $line=<file>  读一行到$line,指针后移一行。缺省读到$_中,以$/作为行分隔符
      2. @array=<file> 文件内容全部读出,含回车符。当从STDIN中读时,可省略为<>
      3. read(F,$in,len[,$offset]) 读入$in
      4. sysread(F,$in,len[,$offset])
      5. getc(F) 读一个字符
    6. 命令行参数@ARGV
      if (defined($ARGV[0]))
      {
        $Para1 = $ARGV[0]; 
      }
      • 写文件
        1. print F ("str"); ()可省略
        2. Printf("format str",$a,$b...)  类C
        3. Write格式化输出
        4. Syswrite(F,$data,length,$offset)  同sysread
      • 文件权限
        1. chmod(mode,filelst);
        2. chown(userid,groupid,filelist) 改变文件的用户与组
        3. umask(maskval)  返回原mask
      • 文件测试 -op expr if (-e "file1"){print STDERR ("file1/n");} 文件是否存在

       

      -r 文件或目录可读
        -w 文件或目录可写
        -x 文件或目录执行
        -o 文件或目录归用户所有
        -R 文件或目录对真正用户可读
        -W 文件或目录对真正用户可写
        -X 文件或目录对真正用户执行
        -O 文件或目录归真正用户所有
        -e 文件或目录存在
        -z 文件存在且大小为0
        -s 文件或目录存在且不为0(返回字节数)
        -f 文件为普通文件
        -d 文件为目录
        -l 文件为符号链接
        -p 文件为命名管道(FIFO)
        -S 文件为一个套口(socket)
        -b 文件为块特殊文件
        -c 文件为字符特殊文件
        -t 打开tty控制台的文件句柄
        -u 文件或目录是设置用户ID号
        -g 文件或目录是设置用户组ID号
        -k 文件或目录的sticky位置位
        -T 文件是文本文件
        -B 文件是二进制文件
        -M 以天为单位的存在时间
        -A 以天为单位访问时间
        -C 以天为单位同代码更改时间
    1.  
      • 定义 
      •  返回值
        • 缺省子程序中最后执行的一个语句值将用作返回值
        • return(retval); 退出子程序并返回值retval
        • return; 返回错误undef
        • eval('subname'); 用该函数,错误由$@取得
      • 参数传递
        • 调用:
          • &sub1($number1,$number2,$number3); 
          • sub1(1,2) 必须在该语句前已经定义
          • sub subname; subname(1,2); sub subname{} 前向引用
          • do subname(1,2); 相当于&subname(1,2)
          •  ()可以省略,但可能引起优先级问题: subname(1,2); subname 1,2
        • 定义:sub sub1{my($number1,$number2,$number3)=@_; ....}  所有参数在数组@_中
        • 子程序中改变@_元素值,会改变主程序中的参数值
        •  my $number1=shift; my $number2=pop; shift、pop一次取一个参数,对@_操作,shift取第一个参数,然后删除,pop取最后一个参数再删除。
        • 用别名或引用传递。定义数组的别名(*)之后,如果有同名的简单变量,则对该变量也起作用
          • $foo=26;  @foo=("here","is","a","list"); &testsub (*foo);
          • sub testsub {local (*printarray) = @_; $printarray = 61; }  --》$foo = 61
        •  用别名传递多个数组
          • @array1=(1,2,3); @array2=(4,5,6); &two_array_sub (*array1 ,*array2);
          • sub two_array_sub{ my( *subarray1, *subarray2) = @_; }
      • 局部变量和全局变量
        • 全局变量:不加说明的变量为全局变量,在子程序中改变会改变已有的值
        • 局部变量my: 只在程序块{}中存在(子程序也是程序块的一种。程序块内部定义的程序块也可见),在程序块外销毁。在主程序开头定义时相当于全局变量。
        • 局部变量local:不存在于主程序中,但存在于该子程序和子程序调用的子程序中。
          • sub spoof {local ($value) = "temporary"; tellme();}
          • sub tellme {print "Current value is $value/n"; }
          • 用local,$value存在于子程序spoof和tellme中
          • 如果改成my,$value存在于子程序spoof,不存在于tellme中
    2. 子程序(函数)
      sub subname
      {
          statements;
      }
       &subname 调用自定义函数,subname内部函数
       
      sub subname($$)
      {
          statements;
      }
      $$ 表示参数类型: $简单变量,@列表,%散列,&匿名子程序, *引用。前面加/表示强制类型一致。;分隔必选和可选参数
      /@$;$ 第一个参数为列表,第二个参数为简单变量,第三个参数为可选的简单变量
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值