Perl学习笔记之一~张润萌

2016-07-21 19:13:52来源:CSDN作者:zrm2012人点击

Perl安装

Windows下Perl安装

(1) 到www.activestate.com上下载ActivePerl,标准的windows msi安装包

(2) 点击安装,默认

(3) 可以在dos命令行下ppm,或在开始菜单上选中Perl Package Manager

(4) 搜索并安装你需要的模块,如:DBI

或从网站上下载模块源码,在dos命令行下:

perl makefile.pl

nmake

nmake test

nmake install

(5)写个测试程序

用文本编辑器新建一个空文件,取名为hello.pl,写如下内容后保存:

#!c:perl/bin/perl

print “Hello Perl”;

exit

执行该程序:

perl hello.pl

Perl学习笔记

1.  正则表达式

在Perl程序中,正则表达式有三种形式:

匹配:m// (还可以简写为 // ,略去 m)

替换:s///

转化:tr///

这三种形式一般都和 =~ 或 !~ 搭配使用(其中 "=~" 表示相匹配,在整条语句中读作 does,"!~" 表示不匹配,在整条语句中读作doesn't),并在左侧有待处理的标量变量。如果没有该变量和 =~ !~ 操作符,则默认为处理 $_ 变量中的内容。

常用模式:

m/pattern/ 结果,m可选

. 匹配除换行符以外的所有字符

[/d/D] 匹配所有字符,包含换行符

[^/d/D] 啥都不匹配

x? 匹配 0 次或一次 x 字符串

x* 匹配 0 次或多次 x 字符串

x+ 匹配 1 次或多次 x 字符串

x? 匹配 0 次或一次 x 字符串 ,非贪婪的

x*? 匹配 0 次或多次 x 字符串,非贪婪的

x+? 匹配 1 次或多次 x 字符串,非贪婪的

.* 匹配 0 次或多次的任何字符

.+ 匹配 1 次或多次的任何字符

{m} 匹配刚好是 m 个的指定字符串

{m,n} 匹配在 m个以上 n个 以下 的指定字符串

{m,} 匹配 m个 以上的指定字符串

{m,n}? 匹配在 m个以上 n个 以下 的指定字符串,非贪婪的

{m,}? 匹配 m个 以上的指定字符串 ,非贪婪的

[] 匹配符合 [] 内的字符

[^] 匹配不符合 [] 内的字符

[0-9] 匹配所有数字字符

[a-z] 匹配所有小写字母字符

[^0-9] 匹配所有非数字字符

[^a-z] 匹配所有非小写字母字符

^ 匹配字符开头的字符

$ 匹配字符结尾的字符

/ 使元字符失去它的特殊作用

/g{N} N是反向引用的组号,如:/(.)/g{1}11/匹配两个连续的字符加11

/d 匹配一个数字的字符,和[0-9] 语法一样

/d+ 匹配多个数字字符串,和[0-9]+ 语法一样

/D 非数字,其他同 /d

/D+ 非数字,其他同 /d+

/w 英文字母或数字或下划线的字符串,和 [a-zA-Z0-9_] 语法一样

/w+ 和 [a-zA-Z0-9]+ 语法一样

/W 非英文字母或数字或下划线的字符串,和 [^a-zA-Z0-9_] 语法一样

/W+ 和 [^a-zA-Z0-9]+语法一样

/s 空格,和 [/n/t/r/f ]语法一样

/s+ 和 [/n/t/r/f ]+ 一样

/S 非空格,和 [^/n/t/r/f] 语法一样

/S+ 和 [^/n/t/r/f]+ 语法一样

/h 匹配横向空白,和[/t ]一样

/v 匹配纵向空白,和[/f/n/r]一样

/R 匹配任何类型的断行

/b 匹配以英文字母,数字为边界的字符串

/B 匹配不以英文字母,数值为边界的字符串

a|b|c 匹配符合a字符或是b字符 或是c字符 的字符串

abc 匹配含有 abc 的字符串

(pattern) () 这个符号会记住所找寻到的字符串,是一个很实用的语法。第一个 () 内所找到的字符串变成 $1 这个变量或是 /1 变量,第二个 () 内所找到的字符串变成 $2 这个变量或是 /2 变量,以此类推下去。$1和/1的区别是:$1表示模式已经全部匹配完成之后的结果,而/1表示模式匹配还没完成时的字符串。

(?:pattern) 告知Perl这括号完全是为来分组而存在的,而不捕获括号

另一种用法是把字符串括起来用来匹配整个字符串,如/(fred)+/

(?pattern) 命名捕获,现在捕获的结果会进入一个哈希%+中,其键就是在捕获时使用的特殊标签,其值则是被捕获的串,在使用捕获标签之后,也给反向引用带来了更新的必要,之前用/1或/g{1}这样的写法,现在可以使用/g{label}或/k这样的写法

/pattern/i i 这个参数表示忽略英文大小写

/pattern/s 默认情况下,点号无法匹配换行符,但是如果字符串中含有换行符,而你希望点号能用来匹配它们,那么/s可以完成这个任务。

/pattern/x 能够在模式里面随意加上空白,目的是更容易阅读,但是原始的空白就失去意义了,它们会被忽略掉,在Perl里,注释也是一种空白

=~ 绑定操作符,默认情况下模式匹配的对象是$_,绑定操作符=~则能让Perl拿右边的模式来匹配左边的字符串,而非匹配$_

s/string1/string2/ 把string1替换成string2

s/^/s+//; 删除开头的空白字符

s//s+$//; 删除结尾的空白字符

/g 进行全局替换

/m ^和$通常是用来匹配整个字符串的开始和结束的,但是当模式加上/m之后,就可以让它们也匹配串内的换行符,这样它们所代表的位置就不再是整个字符串的头尾,而是没行的开头和结尾

正则表达式的八大原则:

原则1:正则表达式有三种不同形式(匹配(m/ /),替换(s/ / /eg)和转换(tr/ / /))。

原则2:正则表达式仅对标量进行匹配($scalar =~ m/a/; 可以工作; @array =~ m/a/ 将把@array作为标量对待,因此可能不会成功)。

原则3:正则表达式匹配一个给定模式的最早的可能匹配。缺省时,仅匹配或替换正则表达式一次( $a = 'string string2'; $a =~ s/string/ /; 导致 $a = 'string 2')。

原则4:正则表达式能够处理双引号所能处理的任意和全部字符( $a =~ m/$varb/ 在匹配前把varb扩展为变量;如果 $varb = 'a' $a = 'as',$a =~ s/$varb/ /; 等价于 $a =~ s/a/ /; ,执行结果使 $a = " s" )。

原则5:正则表达式在求值过程中产生两种情况:结果状态和反向引用: $a=~ m/pattern/ 表示 $a 中是否有子串 pattern 出现,$a =~ s/(word1)(word2)/$2$1/ 则“调换”这两个单词。

原则6:正则表达式的核心能力在于通配符和多重匹配运算符以及它们如何操作。$a =~ m//w+/ 匹配一个或多个单词字符;$a =~ m//d/"匹配零个或多个数字。

原则7:如果欲匹配不止一个字符集合,Perl使用 "|" 来增加灵活性。如果输入 m/(cat|dog)/ 则相当于“匹配字符串 cat 或者 dog。

原则8:Perl用 (?..) 语法给正则表达式提供扩展功能。

 

2.  变量

 

标量:

$answer = 42;

$some = 61_298_040_283_768;

$pi = 3.1415;

$pet = “Camel”;

$sign = “I love my $pet”;

$cose = 'It cose $pet';

$thence = $whence;

$salsa = $moles * $avocados;

$exit = system(“vim $file”);

$cwd = `pwd`;

${days}; 和$days一样

$Dog::days; 在dog包里面的不同的$days变量

$#days; 数组@days的最后一个索引

$days->[28]; $days一个引用指向的数组的第二十九个元素

$days[0];

$days[0][2]; 多维数组

$days{200}{'Feb'}; 多维散列

数组:

@home = (“couch”, “chair”, “table”, “stove”);

或qw( couch chair table stove);

@days = 1..7;

@days[3,4,5] ;

@days[3..5];

@days{'Jan', 'Feb'}

$#days; 返回@days最后一个元素的脚标减1

@whatever = ();和$#whatever= -1;是等效的

散列:

%longday = (“Sun”, “Sunday”, “Mon”, “Monday”, “Tue”, “Tuesday”, “Wed”, “Wednesday”, “Thu”, “Thursday”, “Fri”, “Friday”, “Sat”, “Saturday”);

%longday = (

“Sun” => “Sunday”,

“Mon” => “Monday”,

“Tue” => “Tuesday”,

“Wed” => “Wednesday”,

“Thu” => “Thursday”,

“Fri” => “Friday”,

“Sat” => “Saturday”,

);

$longday{“Wed”}==”Wednesday”;

 

子过程:

任何情况下都不需要对子过程进行事先声明,子过程的定义是全局的。例子:

sub marine {

$n += 1;

print “Hello, sailor number $n!/n”;

}

可以在任意表达式中使用子程序名(前面加上”与号”)来调用它:

&marine;

如果编译器在调用子程序之前看到了子程序的定义,或者Perl可以从语法识别它是子程序调用,那么该子程序就可以像内置函数那样,在调用时省略“与号”。假如子程序和Perl内置函数同名,就必须使用“与号”来调用。

任何子程序都有返回值,子程序中最后一次运算的结果,都会被自动当成子程序的返回值。

Perl子程序可以有参数,要传递参数列表到子程序里,只要在子程序调用的后面加上被括号圈引的列表表达式就行了,如:

$n = &max(10, 15); #包含两个参数的子程序调用。

Perl会自动将参数列表化名为特殊的数组变量@_,该变量在子程序执行期间有效,子程序可以访问这个数组,以判断参数的个数以及参数的值,这表示子程序的第一个参数存储于$_[0]中,当然这和$_变量毫无关系。

可以用my操作符创建私有的词法变量,如:

my($m, $n) = @_;

但是在不使用括号时,只用来声明单个词法变量,如:

my $fred, $barney; #错!没声明$barney

在子程序中可以使用my操作符来创建私有变量,但每次调用这个子程序的时候,这个私有变量都会被重新定义,使用state操作符来声明变量,便可以在子程序的多次调用间保留变量的值,并将变量的作用域局限于子程序中。但是在Perl5.10中,不能在列表上下文中初始化数组和哈希类型,如以下是错误的:

state @array = qw(a b c);

所有新变量的值一开始都是空的,标量被设为undef,数组被设为空列表

return操作符会从子程序中立即返回某个值。只有返回发生在子程序的最后一行代码之前的时候,才需要使用return.

子程序不仅可以返回标量值,如果你在列表上下文中调用它,它就能返回列表值。

单写一个return不给任何参数时,在标量上下文返回值为undef,在列表上下文为空列表

类型团:

类型团(typeglob)的类型前缀是一个*,它代表所有类型。

类型团(或由此的引用)的一个用途是用于传递或者存储文件句柄,如果想保存一个文件句柄,则可以:

$fh = *STDOUT;

或者作为一个真的引用:

$fh = /*STDOUT;

类型团如今的主要用途是把一个符号表取另一个符号表名字作别名,如:*foo = *bar;表示所有叫”foo”的东西都是每个对应的叫“bar”的同意词。也可以通过给类型团赋予引用实现只给某一个变量取别名:

*foo = /$bar; 表示$foo就是$bar的一个别名。

 

4.  操作符

假定:

$a = 123;

$b = 4;

则:

$a ** $b 取$a的$b次幂,即228886641

$a . $b 串连$a和$b,即1234

$a x $b 重复$a的值$b次,即123123123123

and 与

or 或

not 非

xor 异或

<=> 比较,相等时为0,大时为1,小时为-1

-e $a 文件$a存在则为真

-r $a 文件$a可读则为真

-w $a 文件$a可写则为真

-d $a $a是目录则为真

-f $a $a是普通文件则为真

-T $a $a是文本文件则为真

` 命令输入,也叫反勾号操作符,一般形式是qx//,如:

$perl_info = qx(ps $$);

$? 程序返回值

<> 行输入操作符,类似readline函数,放在尖括弧里面的文件句柄(如STDIN)将导致从相关的文件句柄读取下一行。当且仅当行输入操作符是一个while循环的唯一一个条件的时候,其值自动赋予特殊变量$_。如果尖括弧里面的字串是一个标量变量(如,<$foo>),那么该变量包含一个间接文件句柄。

' ' 单引号内所有字符都代表它自己,除了单引号和反斜杠,当要表示这两字符得在它们之前再加上反斜杠来转义。

=~ 绑定操作符,用来指定正则表达式来匹配指定的字符串

~~ 智能匹配操作符,如:$name~~ /Fred/;, %names ~~ /Fred/;

@name1 = @name2;

pop 取出数组中最后一个元素,同时返回该元素值,如:

$fred = pop(@array);

 

push 添加一个元素(或一串元素)到数组的尾端,如:

push(@array, 0); push @array, qw/ 9 0 2 10/;

 

shift 取出数组中第一个元素,同时返回该元素值,如:

$m = shift(@array);

 

unshift 添加一个元素(或一串元素)到数组的开始处,如 : unshift(@array, 5); unshift@array, @other;

reverse 读取列表的值(可能来自数组),并按相反的次序返回该列表,但是它不会修改传进来的参数;如:@barney =reverse(@fred); @wilma = reverse 6..10;

注:在标量上下文中,先将列表中所有字符串全部连接在一起,再对结果进行反序处理,如:$backwards= reverse qw/ yabba dabba doo /;返回:oodabbadabbay

select 假如不为print指定文件句柄,它的输出就会输出到STDOUT,不过可以使用select操作符来改变默认的文件句柄,如:

select BEDROCK;

print “I hope Mr. Slate doesn't find out about this./n”;

sort 读取列表的值(可能来自数组),而且会根据内部的字符编码的顺序,对它们进行排序,但不会修改传进来的参数,如:@sorted= sort(@rocks);

split

它会根据分隔符拆开一个字符串,默认会以空白字符分割$_,split会保留开头出的空字段,并省略结尾处的空字段,如:

@fields = split /:/ ,“abc:def:g:h”; 得到(“abc”,“def”,“g”, “h”)

@fields = split /:/, “:::a:b:c:::”; 得到(“”,””,”””a”,”b”,”c”)

@fields = split; 等效于split //s+/, $_;

5.  控制流程

if结构

if ()

{

...

}

if ()

{

...

}

else

{

...

}

if ()

{

}

elsif()

{

}

else

{

}

unless结构(与if结构相反)

unless()

{

}

unless ()

{

}

else

{

}

while结构

while ()

{

}

until结构(与while相反)

until

{

}

for结构

for(;;)

{

}

foreach结构

foreach $user (@users)

{

}

foreach $key (sort keys %hash)

{

}

given ($ARGV[0]) {

when (/fred/i) {say 'Name has fred in it'}

when (/^Fred) {say 'Name starts with Fred'}

when ('Fred') {say 'Name is Fred'}

default {say 'I don't see a fred'}

}

还可以在每个语句后加continue来继续测试后面的条件

next和last(跳出控制结构)

next操作符允许你将跳至本次循环的结束,开始下一个循环。

last操作符允许你跳至整个循环的结束,如同循环条件表达式为假时发生的情况一样。

当在循环中做上标志,并且指定了希望退出的循环,next和last就能退出多重循环,如:

LINE: …

last LINE;

next LINE;

redo

redo能将控制返回到本次循环的顶端,不经过任何条件测试,也不会进入下一次循环迭代。next和redo两者之间最大 的区别在于next会正常继续下一次迭代,而redo则会重新执行这次的迭代。

表达式后面可以接着一个用来控制它的修饰词,如:

print “$n is a negative number./n” if$n < 0;

裸块

{

}

my $Verbose = $ENV{VERBOSE} // 1; 若未定义则对它赋值为1

 

6.  函数

chop和chomp

读行操作符不能自动将新行符从你的输入中删除,故Perl提供了chop和chomp函数删除之;chop不加区别地去处字符串的最后一个字符,并将结果返回,而chomp仅删除结束标志(通常是”/n”)同时返回被删除的字符数,如:

chop($number = );

$number = ;

chop($number);

defined函数

判断是否定义

die函数

die函数会输出你指定的信息,并且让你的程序立刻终止,并返回不为零的退出码,它还会自动将Perl程序名和行号附加在错误信息的后面;如果不想显示行号和文件名,就在die函数的信息尾端加上换行符。如:

if (! open LOG, “>>logfile”) {

die “Cannot create logfile: $!”;

}

warn函数

warn函数功能和die函数差不多,不同之处在于最后一步,它不会终止程序的运行。

say函数

say和print类似,但每行输出的结尾自动加上换行符,如:

say “Hello World!”;

keys和values函数

keys函数能返回哈希的键列表,values函数能返回值列表,如果哈希没有任何成员,则两个函数都返回空列表,但在标量上下文中,这两个函数都会返回哈希中键/值对的个数,如:

my %hash = (“a” => 1, “b” => 2, “c”=> 3);

my @keys = keys %hash;

my @values = values %hash;

my $count = keys %hash;

each函数

each函数能罗列哈希的每个键/值对,每次对同一个哈希调用此函数,它就会返回下一组键/值对,直到所有的元素都被返回过,但是唯一使用each的地方是在while循环中,如:

while (($key, $value) = each %hash) {

print “$key => $value/n”;

}

exists函数

若要检查哈希中是否有某个键,可以使用exists函数,它能返回真或假,分别表示键存在与否,和键对应的值无关,如:

if (exists $books{“dino”}) {

print “Hey, there's a library card for dino!/n”);

}

delete函数

delete函数能从哈希中删除指定的键及其相对应的值,假如没有这样的键,它就会直接结束,如:

my $person = “betty”;

delete $books{$person};

join函数

join函数不会使用模式,它的功能与split相反,split会将字符串分解为数个片段,而join则会把这些片段联合成一个字符串,如:

my $result = join “:”, 4, 6, 8, 10, 12; $result为4:6:8:10:12

stat函数

stat函数返回文件的属性信息,参数为文件句柄或某个会返回文件名的表达式,如果stat函数执行失败,会返回空列表,要不就返回一个含13个数字元素的列表,如:

my ($dev, $ino, $mode, $nlink, $uid, $gid,$rdev, $size, $atime, $mtime,

$ctime, $blksize, $blocks) =stat($filename);

localtime函数

在列表上下文中,localtime会返回一个数字元素组成的列表,如:

my($sec, $min, $hour, $day, $mon, $year,$wday, $yday, $isdst)

= localtime $timetamp;

$mon 范围从0到11的月份值

$year 是一个自1900年起算的年数

$wday 范围从0(星期天)到6(星期六)

$yday 目前是今年的第几天,范围从0(1月1日)到364或365

7.  特殊标志

/u 强迫下一个字符为大写

/l 强迫下一个字符为小写

/U 强迫后面所有字符大写

/L 强迫后面所有字符小写

/Q 所有后面的非字母数字字符加反斜杠

/E 结束/U, /L,或/Q

# 以#开始的行为注释行

=something

=cut 以=开始的行到以=cut结束的行之间内容被忽略,类似多行注释

v 以v开头后面跟着一个或多个句点分隔的整数的文本,会被当作一个字串文本;该字串的字符的自然数对应v文本里的数值。

__LINE__ 程序当前行号

__FILE__ 文件名

__PACKAGE__ 当前代码所编译进入的包的名字

-w 在perl代码的第一行加上-w,启用警告功能

use diagnostics; 可以看更详细的问题描述,但程序启动会慢点,

或者用命令行选项 -Mdiagnostics,如:

$ perl -Mdiagnostics ./my_program

use strict; 该编译命令放在程序开头告诉编译器对程序执行严格的限制,如果在程序已经写完之后再加use strict,通常会得到一大堆警告信息,所以如果有需要,最好是在一开始写程序时就使用它;一般比整个屏幕长的程序都应该加上use strict,可以用perldoc strict来查看strict文档。

%ENV 存放环境的哈希,如:$ENV{PATH}

$! 当系统拒绝请求的服务FLM时,$!会给出一个理由

$0 保存程序的程序名

$| 将数据输出到文件句柄时,默认情况下都会经过缓冲的处理,不

过,只要将特殊变量$|设定为1,就会使当前的默认文件句柄在

每次进行输出操作后,立刻刷新缓冲区,如:

select LOG;

$| = 1;

select STDOUT;

print LOG “This gets written to the LOG at once!/n”;

$& 字符串里实际匹配模式的部分会被自动存进$&里

$` 匹配起始位置之前的字符串会存到$`里

$' 匹配结束位置之后的字符串会存到$'里

$^I 对一个文件进行操作时可以用$^I= “.bak”;把文件备份

$$ 当前进程号

8.  上下文

标量上下文:

$fred = something;

$stuff = @stuff; ($stuff值为3)

[]可以将一个列表当成一个标量,如:

$wife{“Jacob”} = [“Leah”, “Rachel”, “Bilhah”]; 它创建了一个未命名的数组,并将这个数组的引用放入散列元素$wife{“Jacob”}中。

列表上下文:

@pebbles = something;

@stuff = (“one”, “two”, “three”);

($wilma, $betty) = something;

($dino) = something;

@betty = (); (清空数组)

push @fred, something;

强制指定标量上下文:

scalar(@days); 明确强制@days处于标量上下文中

scalar(keys(%HASH)) 散列里键字的数量

9.  输入输出

输入:

$line = ; #读取下一行

chomp($line = ); #读取下一行,去掉最后的换行符

如果读到文件结尾,“行输入”操作符就会返回undef.

如果把-当作参数传递给函数,则它代表标准输入。

@ARGV 内容是由调用参数组成的列表。

<> 钻石操作符,它查看数组@ARGV以决定该用哪些文件名,如果它找到了空列表,就会改用标准输入流,否则,就会使用@ARGV里的文件列表。

输出:

print操作符会读取一个列表里的所有值,并把每一项依次送到标准输出。

如果print看起来像函数调用,它就是一个函数调用,如:

print (2+3); 返回5

print的返回值不是真就是假,代表print是否成功执行,如:

$result = print(“helloworld!/n”); $result通常为1

10. 文件和目录

有6个文件句柄是Perl保留的:STDIN, STDOUT, STDERR, DATA, ARGV和ARGVOUT。

使用open创建并关联一个文件,open函数需要至少两个参数:文件句柄和文件名;返回值为真表示成功,为假表示失败。

案例:

open(SESAME, “filename”); #从现存文件中读

open(SESAME, “<=""font="" style="word-wrap: break-word;">同上

open(SESAME, “>filename”); #创建文件并写入

open(SESAME, “>>filename”); #附加在现存文件后面

open(SESAME, “|output-pipe-command); #设置一个输出过滤器

open(SESAME, “input-pipe-command|”) #设置一个输入过滤器

open SESAME, “<”, “filename”;

文件句柄可以使用任何名字,一旦打开,文件句柄SESAME可以被用了访问相应的文件或管道,直到它被明确地关闭(close(SESAME))或另外一个open语句将该文件句柄同别的文件关联起来。

打开一个用于接受输入的文件句柄,可以用读行操作符<>来读入一行,如:

if (! open PASSWD, “/etc/passwd”) {

die “How did you get logged in? ($!)”;

}

while () {

chomp;

}

文件测试:

-r 文件或目录,对目前用户或组来说是可读的

-w 文件或目录,对目前用户或组来说是可写的

-x 文件或目录,对目前用户或组来说是可执行的

-o 文件或目录,由目前用户拥有

-R 文件或目录, 对实际的用户或组来说是可读的

-W 文件或目录,对实际的用户或组来说是可写的

-X 文件或目录,对实际的用户或组来说是可执行的

-O 文件或目录,由实际的用户拥有

-e 文件或目录,是存在的

-z 文件存在而且没有内容(对目录来说永远为假)

-s 文件或目录存在而且有内容(返回值为以字节为单位的文件大小)

-f 是普通文件

-d 是目录

-l 是符号链接

-S 是socket类型的文件

-p 是命名管道,也就是先入先出(fifo)队列

-b 是块设备文件

-c 是字符设备万恶就

-u 文件或目录设置了setuid位

-g 文件或目录设置了setgid位

-k 文件或目录设置了sticky位

-t 文件句柄是TTY设备

-T 看起来像是文本文件

-B 看起来像是二进制文件

-M 最后一次修改后至今的天数

-A 最后一次访问后至今的天数

-C 最后一次文件节点编号变更后至今的天数

_ 虚拟文件句柄,用来将上次查询过的文件信息来做当前的测试,如:

if ( -r $file and -W _) {

}

栈式文件测试操作写法将文件测试操作符排成一列,放在要测试文件名前,如:

use 5.010;

if (-w -r $file) {

}

靠近文件的测试会先执行,次序为从右向左。

chdir操作符

改变当前工作目录,如果省略参数,Perl会回到自己的用户主目录:

chdir;

chdir “/etc”or die “cannot chdir to /etc: $!”;

glob操作符

文件名通配符,如:

my @all_files = glob “*”; 它会取得当前目录中所有文件,并按字母顺序排序,但不包含以点号开头的文件。

任何能够在命令行上键入的模式,都可以作为参数交给glob处理,如果要一次匹配多种模式,可在参数中用空格隔开各个模式

另一种写法: my @all_files = <*>;

目录句柄

从目录里取得文件名列表,可以使用目录句柄

opendir 打开

readdir 读取

closedir 关闭

如:

my $dir_to_process = “/etc”;

opendir DH, $dir_to_process;

foreach $file (readdir DH) {

print”one file in $dir_to_process is $file/n”;

}

closedir DH:

unlink操作符

用于删除文件,返回值代表成功删除了多少个文件,如:

unlink “slate”, “bedrock”;

unlink glob “*.o”;

link函数

建立一个新的硬链接,成功返回为真,失败为假,如:

link “chicken”, “egg”;

symink函数

建立一个新的软链接,如:

symlink “dodgson”, “carroll”;

readlink函数

返回符号链接指向的位置,如:

my $where = readlink “caroll”;

rename函数

为现有的文件取个新名字,如:

rename “old”, “new”;

mkdir函数

在现有的目录下建立新的目录,返回值为真表示成功,失败时会设定$!的值,如:

mkdir “fred”, 0755;

rmdir函数

移除目录,每次调用只能删除一个目录,如:

rmdir “fred”;

对于非空目录,rmdir操作会执行失败,可以先用unlink来删除目录的内容,再试着移除已经清空的目录,如:

unlink glob “$dir/* $dir/.*”;

rmdir $dir;

chmod函数

改变文件或目录的权限,如:

chmod 0755, “fred”, “barney”;

chown函数

改变文件的拥有者以及它们所属的组,它们必须以数字形式的用户标识符及组标识符来指定,如:

my $user = 1004;

my $group = 1000;

chown $user, $group, glob “*.o”;

defined(my $user = getpwnam “merlyn”) ;

defined(my $group = getgrnam “users”);

chown $user, $group, glob “/home/merlyn/*”;

11. Perl模块

安装模块:

下载模块文件,解压缩,阅读README或INSTALL文件,如模块使用MakeMaker,则多半可以:

$ perl Makefile.PL PREFIX=Path

$ make install

使用模块:

(1) 查看模块使用说明,如

perldoc File::Basename

(2) 准备使用模块,在程序开头的地方,用use指令来声明,如:

use File::Basename;

如果想要指明要模块提供哪些函数,可以用如下方法:

use File::Basename qw/ basename /;

如果写成如下则不要引入任何函数:

use File::Basename qw/ /; or useFile::Basename ();

(3) 模块使用,如:

my $name = “/usr/bin/perl”;

my $basename = basename $name;

or

my $dirname = File::Basename::dirname$name;

12. 字符串和排序

index函数

查找子串在主串中的相对位置,返回一个整数代表第一个匹配字符的位置,返回的字符位置是从0算起的,如果没找到,那么会返回-1,如:

$where = index($bin, $small);

也可以加第三个参数用来指定开始搜索的地方。

rindex函数

搜索子串最后出现的位置,如:

my $last_slash = rindex(“/etc/passwd”, “/”); 值为4

rindex也有可选的第三个参数,但是是用来限定返回的最大位置

substr函数

返回一个子串,有三个参数:一个字符串,一个从0起算的起始位置以及子串的长度,如:

my $mineral = substr(“Fred J. Flintstone, 8, 5); 返回”Flint”

如果想一直取到字符串的结尾,则省略第三个参数就行了,如:

my $rock = substr “FredJ. Flintstone”, 13; 返回stome

如果第二个参数为负值,则从字符串结尾开始倒数,如:

my $out = substr(“somevery long string”, -3, 2); 返回in

13. 进程管理

system函数

在perl中,启动子程序最简单的方法是用system函数,使用如:

system “date”;

可以利用shell的功能来启动后台进程,如:

system “long_running_command with parameters &”;

system函数也可以用一个以上的参数调用,如:

my $tarfile = “something*wicked.tar”;

my $dirs = qw (fred | flintstone betty );

system “tar”, “cvf”, $tarfile, @dirs;

操作符的返回值是根据子进程的结束状态来决定的,在Unix里,退出值0代表正常,非0值则代表有问题。

exec函数

语法和system函数类似,但有个重要的例外,system函数会创建子进程,子进程会在Perl睡眠期间执行任务,而exec函数却导致Perl进程自己去执行任务,如:

chdir “/tmp” or die “Cannot chdir /tmp: $!”;

exec “bedrock”, “-o”, “args1”, @ARGV;

14. Perl高级技巧

(1)用eval捕获错误

即使有错误,也不至于让程序崩溃。在eval结束时,程序到底是正常结束还是触发异常而导致结束,要看$@变量,如果eval曾经触发异常,$@会含有程序写下的遗言,如果没有错误的话,$@的内容就是空,如:

eval { $barney = $fred / $dino };

print “An error occurred: $@” if$@;

(2)grep

grep的第一个参数是代码块,代码块对列表中的每个元素计算,并返回真或假,而代码块之后的参数则是将要被刷选的元素列表,代码块计算结果为逻辑真的那些元素,将会出现在grep操作符返回的列表中,如:

my @add_numbers = grep { $_ % 2 } 1.. 1000;

 

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台