前言:《Perl语言入门(第四版)》这本书,最后三章看完了,可以说对perl有个基本的认识的,其实我觉得如果学过PHP的人来学这个,真是简单的不能再简单了,不过也可能会觉得他那“丑”了,但对于一个系统管理员来说Perl是一个很好的管理程序,何况像Perl这种语言基本都是系统自带的,就像Shell一样调用方便,这样才会让你可以自由的移动到不同的服务器上,直接进行操作等。之后的学习就是实践了,多看多回顾,最快的学习方法就是亲手写,解决了几个问题之后就会熟练了。
第十三章 字符串和排序 Perl 被设计成 90%擅长处理文本,10%处理其余的问题。 1、 使用索引寻找子串 index 函数 $where = index($big, $small); index 函数总是报告子串出现的第一个位置。 某个子串最后出现的位置 my $last_slash = rindex("/etc/passwd","/"); #值为 4 2、 使用 substr 操作子串 substr 只处理部分的字符串 $part = substr($string, $initial_position, $length); my $mineral = substr("Fred J. Flintstone", 8, 5);#得到“Flint” 它有三个参数:一个字符串,一个从 0 开始编号的初始位置(类似于 index 的返回值),以及子串的长度 index 和 substr 可以很好的一起工作。在本例中,我们提取出了字符串中字母 l 后的子串。 my$ $long = "some very very long string"; my $right = substr($long, index($long, "l" )); 如果想明确要求到达字符串的结尾处,无论其或长或短,可以像下例那样省略掉第三个参数. 3、 使用 sprintf 格式化数据 sprintf 函数的参数和 printf 的参数完全相同(除了可选的文件句柄外),但它返回的是被请求的字符串,而非打印出来。 在“货币数字”中使用 sprintf my $money = sprintf "%.2f",2.49997; 需要将所有有效的精度均保存在数字中,只是在输出时再进行四舍五入。 4、 高级排序 sort subroutine(排序子程序) sub by_number { if($a < $b){-1} elsif($a > $b){1} else {0} } my @result = sort by_number @some_numbers; 种三向的比较(three-way comparison)使用很频繁,太空船(spaceship)符号(<=>) sub by_number {$a <=> $b } cmp 操作符有些类似于字符串比较操作符如 ge 依据值对 Hash 进行排序 :想根据 value 对 hash 排序。 sub by_socre { $score{$b} <=> $score{$a}} 对多个 keys 排序 (发现两边的成绩相同)因为它比较这两个值得结果是 0。 my @winners = sort by_score_and_name keys %score; sub by_score_and_name { $score{$b} <=> $score{$a} #按照降序的成绩 or $a cmp $b; #字母顺序的名字 } 第十四章 进程管理 1、系统函数 最简单方法是使用 system 函数。 system "date"; system ' ls -l $HOME'; system "ls -l \$HOME"; 注意有$时候的引号使用区别 system "long_running_command with parameters &"; 它变成后台运行的进程 2、 避免 Shell !system "rm -rf files_to_delete"or die "something went wrong"; 这不是和系统调用相关的错误,因此 Perl 的$!变量不能描述。 3、exec 函数 system 函数创建子进程,它会立刻去执行请求的操作,Perl 则暂停。exec 函数引起 Perl 自己处理请求的操作。可以将它看作"goto"而非子程序调用。 实际使用 exec 的情况很少,除了和 fork 一起使用外 exec "date"; die "date couldn'trun: $!"; 4、环境变量 在 Perl 中,环境变量可以通过 %ENV 这个 hash 变量得到,hash 中的每一个 key 代表一个环境变量。 5、使用反引号捕捉输出 my $now = `date`; #捕获 date 的输出 print "The time is now $now"; #已经有换行符 因此从安全和效率的观点,应当使用 system。 在 List context 中使用反引号 6、 像文件句柄那样处理 open DATE, "date|"or die "cannot pipe from date: $!"; open MAIL, "|mail merlyn"or die "cannot pipe to mail: $!"; 在第一个例子中, 竖线在右边,命令被调入,且其被打开到 DATE 这个文件句柄进行读入,这和 shell 中的命令date|your_program 类似。 在第二个例子中,出现在左边,命令的标准输入被连接到 MAIL 这个文 件句柄, 这和命令your_program | mail merlyn 类似。 7、 发送和接收信号 my $int_count; sub my_int_handler {$int_count++} … $int_count=0; while(<SOMEFILE>){ …某些处理花了几秒钟时间… if ($int_count) { #中断发生 print "[processing interrupted… ]\n"; last; } } 当每一行处理时,$int_count 的值可能是 0 如果没人按下 Ctrl-C,因此循环会继续处理下一行。但是,如果中断发生,则中 断处理部分会增加$count_int,当在结尾处检测到它时,循环退出。 第十五章 Perl模块 1、查找模块 从两种途径可以得到模块:Perl 发布包中附带的以及从 CPAN 中下载并安装的。 CAPN 上:http://search.cpan.org, 或 kobes 上:http://kobesearch.cpan.org查找。 方法之一是使用 perldoc 相应文档。 $perldoc CGI 2、 安装模块 如果模块使用了 MakeMaker,则需运行的命令大致如下: $ perl Makerfile.PL $ make install 如果在默认目录中不能安装,你可以针对 Makerfile.PL 使用 PREFIX 这个参数来指定目录。 $ perl Makerfile.PL PREFIX=/Users/fred/lib 一些模块的创建者使用另一个模块:Module::Build,来构造及安装他们的模块。此时的命令如下: $ perl Build.PL $./Build install 3、使用简单的模块 File::Basename 模块 用 命 令 perldocFile::Basename,或者你系统中的文档,可以阅读其功能 use File::Basename; 4、仅使用模块中的一些函数 假定需要在以前的程序中加入 File::Basename,同时你发现有一个子程序叫做:&dirname。 因此,你有一个子程序其名字和此模块中的一个函数同名 例如 File:Basename,在 use 声明中,可以使用输入列表(import list)来指定所需的函数,那它将只提供这些函数。 use File:Basename qw/ basename /; use File:Basename qw/ /; #没有引入函数 my $betty = &dirname($wilma); #使用我们自己的子程序 &dirname(这里没有显示) my $name = "/usr/local/bin/perl"; my $dirname = File::Basename::dirname $name; #使用模块中的 dirname 5、File::Spec 模块 将它和目录名一起组合成一个全文件名(fullfilename)。 use File::Spec; #得到上面的$dirname, $basename 的值 my $new_name = File::Spec->catfile($dirname, $basename); 6、CGI.pm 创建 CGI 程序 CGI 模块提供了两种方法,一种是普通的老式函数接口,一种是 OO 接口。我们使用第一种。 7、数据库和 DBI DBI(数据库接口(database interface))模块不是 Perl 默认附带的,但它是最常用的模块之一,因为大多数用户都需要连接到某种类型的数据库上。 DBI 漂亮的地方在于,对于绝大多数常用的数据库,其接口都是一样的, 当安装了 DBI 后,也需要安装 DBD(数据库驱动程序(database driver))。从 CPAN 上搜索 DBD,会返回一长串的结果。 根据数据库服务器,及其版本安装正确的数据库驱动程序。 use DBI; $dbh = DBI->connect($data_source, $username, $password); 一旦连接上数据库后,则进入了 preparing, executing, reading 查询的循环。 当结束时,需要断开和数据库的连接。 $dbh->disconnect( );