《Perl语言入门》 读书笔记

 

标量数据

1.       Perl内部不存在整数值,全部按双精度浮点数的要求来保存并进行运算。

2.       Perl允许直接在整数内插入下划线。123456789 123_456_789是一样的。

3.       取模操作先取整后求余,10.5%3.2 10%3结果相同

4.       乘幂操作 **    2**3 23次方

5.       Repeat 操作 x  “abc” x 3   abc重复3 abcabcabc

6.       内建警告信息。

a)         命令行: perl –w myprogram

b)         内部指明: #!/usr/bin/perl –w

c)         5.6以上的版本:

#!/usr/bin/perl

Use warnings;

d)         显示警告的详细信息

#!/usr/bin/perl

Use diagnostics; #加载全部说明,系统会变慢

可以选择命令行 perl –Mdiagnostics myprogram

7.       Perl变量可被包围使用 print “aaa ${haha}s”;

8.       比较操作符,perl的比较操作符严格区分数字比较和字符串比较

数字                   字符串

==                       eq

!=                        ne

<                          lt

>                          gt

<=                       le

>=                       ge

9.      获取用户输入 $line = <STDIN>;

10.   去除行末换行 chomp($text=<STDIN>);

 

列表与数组

1.       数组 $rock[0] = 1

$rock[1]=2

$rock[90]=90 # 2-89会被分配,定义为undef

$#rock 表示数组最后一个索引值 90

Print $rock[$#rock]; # 90

Print $rock[-1] #90 负向索引

2.       列表直接量

(1,2,3)

(“haha”,2,3)

(1..100) # 100个整数元素

Qw( aa, bb, cc )

3.       ($a, $b) = ($b, $a) #变量互换

($a, $b) = qw( ccc ddd eee ) #eee被忽略

@rock = qw(ff rrr zzz)  # @表示整个数组

4.       数组内插

@rock = qw( cc dd ee );

Print “@rock”; # 输出字符串,元素间用空格分开

5.       Foreach $rock (qw/aa bb cc/)

Foreach $rock (@rocks)

6.       $_ 老地方

7.       Reverse, sort

8.       清空列表的正确用法 @bety = ();

9.       强制标量转换 scalar

Print “I have”, scalar @rocks, “rocks”;

10.   <STDIN>在列表上下文中返回所有剩下的行,每行作为一个元素 @lines = <STDIN>

 

子程序

1.       定义 sub funcname{}

2.       调用 &funcname

3.       返回值 没有return 自动返回最后一次运算的结果

4.       参数,所有参数自动存储在变量@_中,通过 $_[0], $_[1] 进行访问

5.       Use strict

6.       持久性变量(静态变量) state $n = 0;

 

输入与输出

1.       <STDIN>读到行尾会返回undef

2.       钻石操作符 <> 自动读取所有文本

Perl  aa.txt bb.txt cc.txt

While( defined($line = <>) ){

           Chomp($line);

}

3.       文件句柄

Open FILE “file”

Open FILE “<file”

Open FILE “>file”

Open FILE “>>file”

While (<FILE>) {…..}

Close FILE

4.       $! 存储错误信息

5.       Die 参数中加/n 可以屏蔽行号和文件名。Die “error info/n”;

6.       Warn 提供和die 相似的功能,但不会终止文件运行。

7.       5.10 可使用 say,同print 功能类似,结尾单加换行

 

哈希

1.       $hash{$key}

2.       % 整个哈希

3.       胖箭头

My %hash = (

           ‘a’=>’aaa’,

           ‘b’=>’bbb’,

           ‘c’=>’ccc’, #结尾一个多余的逗号

);

4.       @key = keys %hash   @value = values %hash

5.       While( ($key, $value) = each %hash ){  }

6.       Exists $hash{“item”}  delete $hash{“item”}

7.       %ENV 环境变量哈希

正则

1.       避免反向引用二义性。 /g{1}111

2.       =~

3.       命名捕捉, 被捕捉的变量自动存储在哈希%+中。

if( $name =~ m/(?<name1>)/w+ (?<name2>/w+)/ ) say “I saw $+{name1} and $+{name2}”

4.       $& 存储全部匹配段

$` 存储匹配位置之前的字符

$’ 存储匹配位置之后的字符 # 使用任意一个变量都会使正则匹配变慢

5.       s/// 替换

6.       /g 全局匹配

7.       /U 之后的字符全部转换成大写

/L 之后的字符全部转换成小写

/E 结束/U /L的影响

/l 之后的第一个字符小写

/u之后的第一个字符大写

8.       @field = Split /patten/, $str  # 会保留开头处的空字段,忽略结尾的空字段。不建议在split用括号做捕捉,可以用(?:)做分组

9.       My $str = join $glue, @pieces;

10.   列表上下文的捕获,返回捕获列表

@words = ($text =~ /([a-z])/ig)

11.   //m 跨行匹配

12.   $^I <> 的配合使用,更新文件

控制结构

1.       Last=> break  next=>continue

2.       Redo 重复本次循环

3.       标签块  跳出多重循环

LINE: while( <> ){

Foreach (split){

         Last LINE if /__END__/;

}

}

4.       定义否 // 需要版本5.10

My $v = $a{“b”} // 1 #$a{“b”}未定义则用1赋值

文件测试

1.       虚拟句柄_ if( -r $file and –w $file ) => if( -r $file and –w _ )

2.       栈式文件测试 if( -w –r $file ) #测试顺序从右向左

3.       Stat, lstat

4.       Localtime

 

目录操作

1.       Glob通配 my @files = glob “*.php *.html”

2.       老式通配 my @files = <*.php *.html>

3.       目录句柄

opendir DIR, $dir or die “….”

While( $name = readdir DIR ) {}  #readdir 只返回文件名,并不带路径

4.       Unlink  # unlink不能用来删除目录

Rename “old” “new”

Link “source” “target” #硬链接

Symlink “source” “target” #软链接

Readlink 取得链接指向的位置

5.       目录

Mkdir “dir”, 0755 #0755 不能写成字符串形式

Mkdir “dir”, oct($permissions);

Rmdir 只能删除空目录

$$ 当前进程号

Chmod 0755 $file

Chown $user, $group, glob “*.o”

字符串

1.       Index( $big, $small ) #big里找small首次出现的位置,找不到返回-1

Rindex

2.       Substr( $str, $pos, $len )

Substr($str, 0, 5) = ‘hello’ #substr可用来做字符串的部分替换

3.       Sprint

4.       高级排序

Sub by_num{ if($a<$b){-1} elsif($a>$b){1} else {0} }

@res = sort by_num @nums #函数回调无需加&

5.       飞碟操作符 sub by_num{ $a<=>$b }

Sub by_num{ $a cmp $b }

@res = sort {$a<=>$b} @nums;

6.       多重排序

Sub by_score_and_name{

           $score{$b} <=> $score{$a} or

                    $a cmp $b

}

7.       智能匹配 ~~ #5.10版本

8.       Given-when #5.10版本

Use 5.010;

Given( $var ){

           When( $_ ~~ /hello/i ) { say “…..”;continue }

           When( $_ == ‘haha’ ) {say “….”; break}

           Default                        { say ‘….” }

}

9.       多项when

Foreach (@names){

           When() {}

           When() {}

}

进程

1.       System 启动子进程,返回0代表成功

2.       Exec   当前进程,exec后的代码不再执行

3.       反向引号捕捉结果 $date = `date`;

4.       文件进程

Open DATE “date|” or die …. # date 结果输出到DATE句柄

Open MAIL “|mail user” or die #MAIL句柄的输入传递给mail命令

my $now = <DATE>

print MAIL “hello user”;

close MAIL;

die “$?” if $? #命令返回值存在$?中,0表示成功,非0表示失败

5.       Fork

Defined( my $pid = fork ) or die ‘…..” #fork返回非undef ,下一行开始子进程开始执行

Unless($pid){ # 自由父进程的pid不是0

           …..

}

Waitpid($pid, 0);#父进程等待子进程结束

其他技巧

1.       Eval {  }; 用于捕捉错误,结尾必须有分号,如果发生错误,程序停止执行,错误信息保存在$@

2.       Grep 筛选列表

My @odd_num = grep { $_%2 } 1..1000 #能被2整除的被筛选到@odd_num列表中

My @lines = grep /hello/, <FILE>

3.       Map 对列表每个元素

My $res = map { &func($_) } @data;

4.       列表切片

My( undef, $var, undef, undef ) = split /:/;

My $time = (stat $file)[9]; #括号为必须

My( $var1, $var2 ) = (split/:/)[1,5];

5.       数组切片

My @names = @all_name[1,2,3];

Print “@all_name[4,5,6]”;# 切片是可以内插的

6.       哈希切片

My @scores = ( $score{“a”}, $score{“b”} );

My @scores = @score( qw/ a b / );

My @list = qw/a b c/;

My @value = (11,22,33);

@score{@list} = @value;   # $score{“a”} = 11 $score{“b”} = 22 $score{“c”} = 33

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值