加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl笔记

发布时间:2020-12-16 00:14:32 所属栏目:大数据 来源:网络整理
导读:学习网址:http://www.cbi.pku.edu.cn/chinese/documents/perl/perl2.htm 一、基础 ? 1:以#! /usr/local/bin/perl -w开头 ??????? 整数是浮点数特例,寄存在浮点寄存器中。0开头是八进制、0x是16进制。 ??????? 定义变量:$var = "some data"; 或者 $var =

学习网址:http://www.cbi.pku.edu.cn/chinese/documents/perl/perl2.htm

一、基础

? 1:以#! /usr/local/bin/perl -w开头

??????? 整数是浮点数特例,寄存在浮点寄存器中。0开头是八进制、0x是16进制。

??????? 定义变量:$var = "some data"; 或者 $var = 0;注意:字符串结尾没有NULL

??????? b:回车、E:结束(U,L,Q)作用范围、U:直到E之间的字符全转换成大写、

??????? L:与U相反、l:下一个字符小写、Q不匹配特殊模式字符、 r,n,b回车换行Tab。

??????? 用取消转义。

??????? eg:???? $a = "TLHIS IS A ESTRING"; # same as "This is a STRING"
????????单引号字符串与双引号字符串有两个区别:一是没有变量替换功能,二是反斜线不支持转义字符。但是可以跨多行

??????? eg:??$text = 'This is two
?????????????????? lines of text
?????????????????? ';?? #等效:$text = "This is twonlines of textn";???????

??????? 字符串和数值直接运算:

??????? eg: $result = "hello" * 5; ?# $result = 0 || $result = "12a34" +1; # $result = 13 || $result = "43" + 34; #result=77;

? 2:算术操作符

????????整数比较:< 小于、> 大于、== 等于、<= 小于等于、>=大于等于、!= 不等于、<=> 比较返回1、0、-1

??????? 字符串比较:lt 小于、gt 大于、eq 等于、le 小于等于、ge大于等于、ne不等于、cmp比较返回1、0、-1

??????? 逻辑操作符: || :或、&& 与、xor异或、! $var

??????? 位操作符:&:位与、|:位或、~:位非、^:位异或、$x << 1:位左移、$x?>> 1:位右移

???????字符串联结和重复操作符:“.”链接、“x”重复。
????? ?eg:$newstring = "potato" . "head";??? $newstring = "t" x 5;?? ?$result = $var == 0 ? 14 : 7;

二、? 文件操作

???????? 打开open:
???????
open (MYFILE,"file1") || die ("Could not open file");?? #以制度方式打开文件file1
??????? open(outfile,">outfile") || die ("Could not open file");??#以写方式打开文件file1
??????? open(appendfile,">>appendfile") || die ("Could not open file");??#以追加方式打开
??????? 用close(MYFILE); 关闭文件

?????? ?读文件:
??????? $line = <MYFILE>;? #文件一行行读入line变量中并将指针指向下一行。
??????? @array = <MYFILE>; #文件的每行全部读入array数组中,每个元素为一行(含回车)。

??????? 写文件:
??????? print?MYFILE ("Here is an output line.n"); || print?STDIN/STDOUT $var;

??????? 判断文件类型:
??????? 语法为:-op expr,
???????
eg:? if (-e "/path/file1") {????print STDERR ("File file1 exists.n");????}?#是否存在
??????? 常用判断:-e :存在?、 -d :目录?、-f :普通文件、-r :可读? -w:可写? -x:可执行?、-z :空文件?
??????? eg:open(INFILE,"infile") && !(-e "outfile") &&?open(OUTFILE,">outfile") || die("Cannot open filesn");

???????
?命令行参数:
????????存储命令行参数的数组@ARGV[ ] ;$var = $ARGV[0]; # 第一个参数、$numargs = @ARGV; # 参数的个数
??????? eg: @ARGV = ("myfile1","myfile2"); #实际上由命令行参数赋值|
????????????????????? ?while ($line = <>) {????print ($line);????}?
?????????????????? ?#1、当PERL解释器第一次看到<>时,打开以$ARGV[0]为文件名的文件;
??????????????????? #2、执行动作shift(@ARGV); 即把数组@ARGV的元素向前移动一个,其元素数量即减少了一个。
??????????????????? #3、<>操作符读取在第一步打开的文件中的所有行。
??????????????????? #4、读完后,解释器回到第一步重复

??????? eg: 用管道发送邮件如下:
???????????????? ?open (MESSAGE,"| mail dave");
????????????????? print MESSAGE ("Hi,Dave! Your Perl program sent this!n");
????????????????? close (MESSAGE);
??????
??my %opt= ();? #定义句柄
??????? GetOptions(%opt,'user_control','list_control','sender|s=s','receive|r=s'); #定义参数
??????? $memd->delete($opt{username}); #获得
三、?? 模式匹配 (用转义)
???????? 模式指在字符串中寻找的特定序列的字符,由反斜线包含:/def/ = 模式def。
????????
eg:@array = split(/ /,$line);? #以空格分隔行到数组中。

?????????匹配操作符:“ =~ ”若匹配,为真;“ !~ ”若不匹配为真
???????? $question =~ /please/? :在questuin串中寻找please这个单词 成功返回真,否则是假。

?????????字符 + :贪婪匹配一个或者多个+前面的字符;eg:@array = split (/ +/,$line);#多个空格分隔时。
????????????????????????? (split:不判断第一个是不是空格,默认装入array[0],余下判断,TAB作为一个单词)。

??????????

?????????字符[ ]和[^ ] :匹配[ ]中的一个字符,eg:/a[0123456789]c/?;与+联合使用:/d[eE]+f/ 匹配含一个以上e/E字符。
??????????????????????????????????[^ ]表示除其之外的所有字符,eg:/d[^deE]f/?? 匹配d加非e字符加f的字符串。
????????????????????????????????? [ 0-9a-zA-Z] :是匹配某个的简写

?????????字符 *和? :* 匹配0个、1个或多个相同字符; ?匹配0个或1个该字符。
???????????????????????????????? eg:/de*f/? 匹配df、def、deeeef等; /de?f/匹配df或def

???????? 字符 ^和$: “ ^ ” 以xxx开头的行(串);“ $ ”以xxx结尾的串;“b“在单词边界匹配;“B”在单词内部匹配。
????????????????????????????????
eg:/bdef/ 匹配defghi等以def打头的单词,不匹配abcdef。/defb/ 匹配abcdef等以def结尾的单词,但不匹配defghi,/bdefb/只匹配字符串def。注意:/bdef/可匹配$defghi,因为$并不被看作是单词的部分。/Bdef/匹配abcdef等,但不匹配def;/defB/匹配defghi等;/BdefB/匹配cdefg、abcdefghi等,但不匹配def,defghi,abcdef。
??????? d、D、w、W、s、S: d = [0-9] ; D = [^0-9]; w = [_0-9a-zA-Z]; W = [^_0-9a-zA-Z] ;s = [ rtnf ] ;S = [^ rtnf];
?????????????????????????????????????????????????
??????? eg:/[da-z]/匹配任意数字或小写字母。

?????? 匹配所有字符:“ .* ”:“ . ”匹配所有字符 “ * ”匹配>=0个

?????? 匹配指定数目的字符:字符对{}指定所匹配字符的出现次数。如:/de{1,3}f/匹配def,deef和deeef;/de{3}f/匹配deeef;/de{3,}f/匹配不少于3个e在d和f之间;/de{0,3}f/匹配不多于3个e在d和f之间。

?????? 指定选项两个任选:字符"|"指定两个或多个选择来匹配模式。如:/def|ghi/匹配def或ghi。

?????? 模式的部分重用: 当模式中匹配相同的部分出现多次时,可用括号括起来,用n来多次引用,以简化表达式:
??????????????????????????????????????? /d{2}([W])d{2}1d{2}/ 匹配:
?????????????????????????????????????? 12-05-92
???????????????????????????????????????26.11.87
?????????????????????????????????????? 07 04 92等
?????????????????????????????????????? 注意:/d{2}([W])d{2}1d{2}/ 不同于/(d{2})([W])121/ ,后者只匹配形如17-17-17的字符串,而不匹配17-05-91等。

?????????$n、$&:匹配到的()的数据用$1,$2,$3等表示; $&表示匹配全部。

???????? g、i、x、m、o、s:eg:@matches = "balata" =~ /.a/g; # now @matches = ("ba","la","ta")? 匹配所有可能的模式;当使用了选项g时,可用函数pos来控制下次匹配的偏移:? $offset = pos($string);?? pos($string) = $newoffset;
???????????????????????????????????????????????eg: /de/i 匹配de,dE,De和DE。忽略大小写
???????????????????????????????????????????????eg: /a.*bc/s匹配字符串axxxxx nxxxxbc,但/a.*bc/则不匹配该字符串。将串看成单行。
???????????????????????????????????????????????eg: /d{2} ([W]) d{2} 1 d{2}/x? 等价于 /d{2}([W])d{2}1d{2}/?? 忽略模式中的空格

???????? 替换操作符:语法为s/pattern/replacement/,其效果为将字符串中与pattern匹配的部分换成replacement ;可以与上面的g/i/o/e/m/s/x配合用。

???????? 翻译操作符tr:tr /string1/string2/,string2为替换部分,把string1中的第一个字符替换为string2中的第一个字符,把string1中的第二个字符替换为string2中的第二个字符,依此推。当string1比string2长时,其多余字符替换为string2的最后一个字符;当string1中同一个字符出现多次时,将使用第一个替换字符。(c/d/s)c :翻译所有未指定的字符;d :删除所有指定字符;s:把多个相同的输出字符缩成一个。
eg:$string =~ tr/d/ /c;把所有非数字字符替换为空格。$string =~ tr/t //d;删除tab和空格;? $string =~ tr/0-9/ /cs;把数字间的其它字符替换为一个空格

四、循环

????????? 1:if......else......
?????????? if ( <expression>) {
??????????????????? <statement_block_1>
???????????}
????????? elsif ( <expression> ) {
?????????????????? <statement_block_2>
?????????? }
?????????? ...
????????? else{
????????? ???????? <statement_block_3>
??????? ?? }
????????? 2:while......
????????? while ( <expression> ) {
???????? ??????? <statement_block>
????????? }
????????? eg: open (READ,"Filename");
??????????????? open (WRITE,"Filename");
??????????????? while (<READ>) {
?????????????????????? print WRITE ("$_");
???????????????? };close(WRITE);close(READ);
?????????3:until......
?????????until ( <expression> ) {
????????? ??? ?<statement_block>
????? ?? }

???????? 4:for......
??????????? ?
for ($count=1; $count <= 5; $count++) {
????????????? ????# statements inside the loop go here
?????????? ? }

?????????5:foreach......
?????????? ??? foreach localvar (listexpr) {
????????????????? ?statement_block;
???????????? ?}? #此处的循环变量localvar是个局部变量,如果在此之前它已有值,则循环后仍恢复该值。

???????? 6:do......
?????????? ?? do {
????????????????????????? statement_block
?????????????} while_or_until (condexpr);
退出循环为last,执行下一个循环为next ,重复此次循环redo。

??????? 单行条件:语法为statement keyword condexpr。其中keyword可为if、unless、while或until。
?
???????eg:
?????????????? print ("This is zero.n") if ($var == 0);
?????????????? print ("This is zero.n") unless ($var != 0);
?????????????? print ("Not zero yet.n") while ($var-- > 0);
?????????????? print ("Not zero yet.n") until ($var-- == 0);
??虽然条件判断写在后面,但却是先执行的。

五、子程序

?????? 1:子程序定义??sub functionsub{????statements; ?}? 调用functionsub(); 一般先定义后调用。返回值为return(vatval);

??????? 2:定义变量:my、local : my定义的变量只在该子程序中存在;local存在于该子程序和该子程序调用的子程序中,但不在主程序中
????????????? eg:my $var = "abcd"; local @array = {1,2,3,4,5,6};

??????? 3:参数传递:_@
??????????????&addlist (@mylist);??? #先调用后定义用&调用
????????????? &addlist ("14","6","11");
????????????? &addlist ($value1,@sublist,$value2);
??????????????...
????????????? sub addlist {
?????????????????????? my (@list) = @_;? #参数讲送入list元素中
????????????????????????? ??...
?????????????? }

?????????????? 参数为数组时,子程序只将它赋给一个数组变量。如
????????????? ?sub twolists {
???????????????????????my (@list1,@list2) = @_;
?????????????? }
????????????? 中@list2必然为空。但简单变量和数组变量可以同时传递:
????????????? &twoargs(47,@mylist); # 47赋给$scalar,@mylist赋给@list
????????????? &twoargs(@mylist); # @mylist的第一个元素赋给$scalar,其余的元素赋给@list
???????????????????? ...
????????????? sub twoargs {
??????????????????????? my ($scalar,@list) = @_;
???????????????????????? ...
????????????? }
???????? 4:用别名传递数组参数:
???????????????用前面讲到的调用方法&my_sub(@array)将把数组@array的数据拷贝到子程序中的变量@_中,当数组很大时,将会花费较多的资源和时间,而用别名传递将不做这些工作,而对该数组直接操作。形式如:
???????????????@myarray = (1,5);
???????????? ??&my_sub(*myarray);

???????????????sub my_sub {
???????????????????????my (*subarray) = @_;?
???????????????}?? #subarray是myarray的别名。

???????? 5:递归子程序:除了不被子程序改变的变量外,所有的变量必须的局部的

???????? 6:预定义的子程序:
??????????????
BEGIN子程序在程序启动时被调用;END子程序在程序结束时被调用;AUTOLOAD子程序在找不到某个子程序时被调用: ???????????????eg:BEGIN?{?? print("Hi! Welcome to Perl!n");??} ??????????????????????? AUTOLOAD{ ??????????????????????????????????? ??? print("subroutine $AUTOLOAD not foundn"); # 变量$AUTOLOAD即未找到的子程序名 ??????????????????????????????????????? print("arguments passed: @_n"); ???????????????????????????????????? }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读