《Perl 语言入门》学习笔记

在2015年有一段时间就看过Perl语言,当时心情也不好,很颓废,看了一段时间就又放下了,始终没有入门。今年年初终于下定决心,问自己:如果Perl入门需要花费你一年的时间,你愿意吗?毫无疑问,当然想,于是每天早上看一点、看一点,一本书用了差不多半年的时间也看完了。如果再问我现在入门了吗,只能诚实的说:没有。Perl这个语言真的是太灵活了,看了一本书,现在大脑也还是空空的,完全写不出东西。估计要等我再把《Perl 进阶》看完,才能找到点感觉,写点简单的脚本。恩,到时候再见。


安装包:/sbin/cpanm

程序开头:

#!/usr/bin/perl
use utf8;
use strict;
use warnings;
use autodie;
use Data::Dumper;

第一章 简介

Perl 语言常识

第二章 标量数据

1.开启警告
use warnings;

2.使用utf8
use utf8;

3.使用更详细的警告信息
use diagnostics;
或者
perl -Mdiagnostics 脚本

4.从标准输入读取一行数据
$line = <STDIN>

5.去除换行符 chomp

6.perl 没有专用的bool类型

7.没赋值的变量值是undef,检查undef使用defined函数

8.变量内插时为防止混淆,可以使用shell风格的形式,例如标量$a可以写成${a}

第三章 列表与数组

1.数组@arr,最后一个索引值$#arr

2.qw简写,创建一个单词数组 @arr = qw/a b c d/;

3.把数组当成堆栈使用,向右边压入(push)或者取出(pop)一个元素

4.与push、pop相反操作,像数组的左边压入(unshift)或者取出(shift)一个元素

5.splice操作符,类似于python列表的切片操作,但功能更强大

6.foreach 数组时,修改控制变量的值,会直接修改数组,这个跟python不一样

7.未定义变量时,使用perl最常使用的默认变量$_

8.reverse 对列表取反,sort 对列表排序

9.each操作符,迭代列表,返回索引和值

10.指定标量上下文scalar

11.比较有意思的each操作符,每次对数组迭代时,可以直接获得下标index和值value.
my @numbers = 3..6;
while (my ($index,$value) = each @numbers) {
    print "$index: $value\n";
}
print '*' x 10,"\n";
foreach my $index (0..$#numbers) {
    print "$index: $numbers[$index]\n";
}

12.从标准输入读入数据时直接去掉换行符
chomp(my @lines = <STDIN>)

第四章 子程序

1.返回值,最后一个执行的表达式

2.sub子程序的参数值存在@_数组中

3.定义变量时,尽量使用词法变量my,限定变量的作用域

第五章 输入与输出

1.<>钻石操作符 后面每接的一个参数就是一个文件,while循环会按顺序读取这些文件里的每一行,然后输出
while (<>) {
    chomp;
    print "It was ($_) that I saw!\n";
}

2.@ARGV 从命令行读取的参数列表

3.Larry建议你使用大写字母来命令文件句柄

4.打开文件,可以使用容易理解的三个参数形式,和shell很类似的风格
open FH,’>>’,file;
close FH;

5.unix 风格换行\n,windows风格换行\r\n,可以使用crlf进行转换,’>:crlf’ 和 ‘<:crlf’

6.die 函数
$! 输出可读的系统错误信息
\n 加换行符,输出信息时不会带文件名和行号;不加就带着

7.自动检测致命错误 autodie

8.读取文件内容
if (! open TH,"<","t.txt") {
    die "Can't open t.txt: $!";
}

while (<TH>) {
    chomp;
    print "$_\n";
}

9.新建文件,写入内容
if (! open TH,">","t.txt") {
    die "Can't open t.txt: $!";
}

print TH "This first newline\n";

10.追加文件内容
if (! open TH,">>","t.txt") {
    die "Can't open t.txt: $!";
}

print TH "This is newline\n";

11.标量变量中的文件句柄
my $rocks_fh;
open $rocks_fh,"<","rocks.txt" or die "Can't open rocks.txt: $!";
while (<$rocks_fh>){
    chomp;
    print "$_\n";
}

12.select 可以选择print 输出时的文件句柄;$|=1立刻刷新缓冲区

第六章 哈希

1.反转哈希
my %m = reverse %score;

2.胖箭头
my %score = (
    "lee"=>"3",
    "budong"=>"4",
    "tom"=>"5",
);

3.内置函数keys/values
my @k = keys %score; #得到哈希键列表
my @v = values %score;#得到哈希值列表
my $count = keys %score;#得到哈希的数量

4.each函数,返回哈希中的一组键值对
while ( my($key,$value) = each %score ) {
    print "$key => $value\n";
}

5.对哈希的键排序后输出
foreach my $key (sort keys %score) {
    print "$key => $score{$key}\n";
}

6.exists 判断键是否存在哈希中
if (exists $score{marry}) {
    print "exists.\n";
} else {
    print "not eists.\n";
}

7.删除一个哈希的键值对
delete $score{lee};

第七章 漫游正则表达式王国

基础的正则表达式概念

第八章 用正则表达式进行匹配

1.修饰符 /i 忽略大小写;/s改变.的意思,可以匹配换行符,匹配任意字符;/x加入空白符;\a 按照ASCII解释;\u按照Unicode解释

2.锚位 /A绝对开头;/z绝对结尾;/Z结尾容忍换行符\n

3.绑定操作符=~

4.捕获变量,捕获不到是空字符串,不是undef

5.命名捕获 (?<LABEL>PATTERN)

6.自动捕获变量 $`捕获前 $&捕获  $’捕获后

第九章 用正则表达式处理文本

1.s/// 进行替换

2./g修饰符进行全局替换

3.split操作符 my @fields = split /separator/,$string;

4.join函数,my $resutl = join $glue,@pieces;

5.$^I 配合 <> 钻石操作符修改文件内容

6.直接命令行边界文件,跟sed功能差不多
perl -p -i.backup -w -e "s/^/bdzr_thinking /" a.txt

第十章 其他控制结构

1.unless if的否定

2.until while的否定

3.表达式修饰符 print “$n is a negative number.\n” if $n < 0;

第十一章 perl模块

1.导入perl模块,程序内部:
use local:lib;
安装在其他地方,使用编译指令lib指定这个路径:
use lib qw(/User/budong/perl5)

2.File:Basename
basename
dirname

3.只导入需要的函数
use File:Basename qw/basename/

第十二章 文件测试

1.查看文件测试操作符清单perldoc -f -X

2.虚拟文件句柄,避免重复查询文件信息
my $filename = "a.txt";
if (-r $filename and -w _) {
    print "r and w ok\n";
}

3.栈式文件测试操作符
if (-r -w $filename) {
    print "r and w ok\n";
}

4.stat 和 lstat函数
my($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks)  = stat($filename);

5.localtime函数

第十三章 目录操作

1.文件名通配
my @all_txt_files = glob '*.txt';
my @all_txt_files_2 = <*.txt>;

2.目录句柄
my $dir_to_process = "/tmp";
opendir my $dh,$dir_to_process or die "Can't open $dir_to_process: $!";
foreach my $file (readdir $dh) {
    print "one file in $dir_to_process is $file\n";
}
closedir $dh;

3.删除文件 unlink

4.重命名文件 rename

5.创建删除目录 mkdir rmdir

6.修改权限 chmod

7.修改隶属关系 chown getpwnam getgrnam

8.修改时间戳 utime

第十四章 字符串与排序

1.用index查找字符串
$where = index($big,$small)

2.用substr操作字符串
$part = substr($string,$initial_postion,$length)

3.比较有意思的飞船操作符
if ($a < $b) {-1} elsif ($a > $b) {1} else {0} 可以写为 $a <=> $b

第十五章

1.智能匹配操作符 ~~

2.given when

第十六章 进程管理

1.system 函数

2.exec 函数

3.用反引号捕获输出结果

4.fork

第十七章 高级Perl技巧

1.切片
my @names = qw{zero one two three four five six seven eight nine};
my ($a,$b) = @names[1,5];

my %score = (
    "a" => 1,
    "b" => 2,
    "c" => 3,
);

my @values = @score{ qw/a b c/ };

2.使用eval捕获错误
my $fred = 1;
my $dino = 0;
my $barney = eval { $fred / $dino };
print Dumper($barney);

3.Try::Tiny模块,可以像python一样使用try...catch...finally

4.autodie

5.grep 过滤列表
my @odd_numbers = grep { $_ % 2 } 1..100;

6.map 对列表元素做处理好,再输出