Tag: 语言



11 八 09

前言:第十章是讲更多的控制结构方面,是之前的一个完善,第11和12章主要讲目录文件方面的操作,有SHELL基础的会发现很多都可以和SHELL中的一些命令对比,甚至是一样的。学习到12章这本书已经只有1/5了,再过4章就完结了,算是有个大概的了解的,最后一篇笔记就是最后四章了。

第十章 更多控制结构
1unless 控制结构
在条件为假时执行 跟if 相反
也可以用unless ...else 但这种情况最好还是用if ... else
 
2until 控制结构
跟while循环条件部分取反
until($j > $i){
$j *=2;
}
只是在条件为假时重复执行,而不是在条件为真的情况下执行。
 
3、表达式修饰符
print "$n is a negative number.\n" if $n<0;
简写的形式读起来很像英文:输出这段消息,如果$n 小于 0。
跟下面是一样的
if($n < 0){
print "$n is a negative number.\n";
}
 
4、The Naked Block 控制结构
裸块
{
body;
body;
body;
}
 
5elsif语句
elsif,只有一个 e。
 
6、自增和自减
自增运算符(++)会使标量变量自动加1,这和 C 以及类似语言是一样的:
$bedrock++;  #$bedrock 的值加1;
自减运算符(--)将标量变量的值减
 
将++放在变量前,先将此变量增1,再取其值。这是前置++
my $m = 5;
my $n = ++$m;#$m 的值增加到6,将此值赋给$n
my $d = $m++; #$d 得到先前的值(5)然后自增到6
my $e = $m--; #$e 得到先前的值(6),再自减到5
 
7for控制结构
for 循环的最常用用法是,进行重复的运算:
for($i =1; $i <=10; $i++){
print "I can count to $i;\n";
}
#从1到10
 
关键字 foreachfor 是等价的。
 
8、循环控制
last 操作
last 会立刻结束循环和C语言中的break类似
#输出所有出现 fred 的行,直到遇见 _ _END_ _标记
while(<STDIN>){
if(/_ _ END_ _/){
#这个标记之后不会有其它输入了
last;
}elsif(/fred/){
print;
}
}
##last 跳转到这里##
last 常用在最内层的循环体中,可以从中跳到外面来;
 
next 操作
它跳到当前循环块的最后面(块内)。next 之后,又会进入下一轮循环(这和 C 或者类似语言的 "continue"相似)
 
循环控制的第三个操作是 redo。它会调到当前循环块的顶端,不进行条件表达式判断以及接着本次循环。
nextredo 的最大区别在于,next 会进入下一次循环,而 redo 会继续执行本次循环。
 
9、 标签块
标签在 Perl 中就像一般标识符一样:由字母,数字,下划线组成,但不能由数字开头。
推荐标签均大写。这会防止标签和其它标识符冲突,同时也使之在代码中更突出。同时,标签很少使用,
LINE: while(<>){
oreach (split){
last LINE if /_ _END_ _/; #推出 Line 循环}
}
 
10、 逻辑操作符
逻辑判断的逻辑与 AND(&&)和逻辑或 OR (||):
 
11、短路操作的值
短路操作的结果是最后被执行语句的返回值,而非仅仅是一个 Boolean 值。结果是相同的。如果最后被执行的部分为真,则整个为真;为假,则整个为假。
 
12、 三元操作符 ?:
三元操作有些像 if-then-else 一样,不过是在一个表达式之中。被称作“三元”操作符是因为它有三个操作数,看起来如下:
Express ? if_true_expr : if_false_expr
 
13、 控制结构:使用部分求值的操作符
前面三个操作符 &&, || , ?:,均有一个共同的特殊性质:根据左侧的值(true 或 false),来判断是否执行右侧代码。
 
第十一章 文件检验
1、文件检测操作
使用-e 选项
die "Oops! A file called '$filename' already exists.\n"
if -e $filename;
 
选项	含义
-r		文件或目录对此(有效的)用户(effective user)或组是可读的
-w		文件或目录对此(有效的)用户或组是可写的
-x		文件或目录对此(有效的)用户或组是可执行的
-o		文件或目录由本(有效的)用户所有
-R		文件或目录对此用户(real user)或组是可读的
-W		文件或目录对此用户或组是可写的
-X		文件或目录对此用户或组是可执行的
-O		文件或目录由本用户所有
-e		文件或目录名存在
-z		文件存在,大小为 0(目录恒为 false)
-s		文件或目录存在,大小大于 0(值为文件的大小,单位:字节)
-f		为普通文本
-d		为目录
-l		为符号链接
-S		为 socket
-p		为管道(Entry is a named pipe(a "fifo"))
-b		为 block-special 文件(如挂载磁盘)
-c		为 character-special 文件(如 I/O 设备)
-u		setuid 的文件或目录
-g		setgid 的文件或目录
-k		File or directory has the sticky bit set
-t		文件句柄为 TTY(系统函数 isatty()的返回结果;不能对文件名使用这个测试)
-T		文件有些像“文本”文件
-B		文件有些像“二进制”文件
-M		修改的时间(单位:天)
-A		访问的时间(单位:天)
-C		索引节点修改时间(单位:天)
 
2statlstat 函数
要得到文件的其余信息,可以使用 stat 函数,其返回 Unix 系统调用 stat 时相同的值
$dev$ino
文件的设备号和索引节点号。
$mode
文件的权限位以及一些其它的位。
$nlink
文件或目录的(硬)连接数。
$uid$gid
指文件所有权的 user ID 及 group ID。
$size
返回其大小,单位:字节,同 – 文件检测项相同。
$atime, $mtime,$ctime
这三个时间,它们按照系统的时间格式:32 位
当 stat 的参数是符号连接时,其返回的信息是此符号连接指向的实体的信息,而非符号连接本身的信息,除非此符号连接所指向的内容不能被访问。
。如果需要得到(几乎是没用的)符号连接本身的信息,可以使用 lstat 代替 stat(它按照相同的顺序返回同样的值)。如果其操作数不是符号连接,则 lstatstat 返回的值相同。
 
3localtime 函数
。gmtime 函数同 localtime 一样,除了其返回的形式为是世界时间(曾经被叫做格林威治时间)。如果想从系统中得到当前的时间,可使用 time 函数。localtimegmtime 在默认的情况下都使用 time 的当前值,如果没提供参数:
my $now = gmtime; #得到当前的时间
 
4、位操作
按位与操作符(&)返回操作符左边和右边相应位操作的结果。
10 & 12 按位与;
10 | 12 按位或;
10 ^ 12按位异或;
6 << 2位左移,
25 >> 2位右移,
~10 位取反,
 
5、使用位串
所有的
使用特殊的下划线文件句柄
 
第十二章 目录操作
1、在目录树上移动
chdir改变工作目录 类似Shell的cd 命令
chdir "/etc" or die "cannot chdir to /etc: $!";
 
2、由于尖括号的含义可以指从文件句柄读入或 globbing,Perl 怎么判断使用哪一个操作呢?如果尖括号之间是一个严格意义
上的标识符,则其为文件句柄读入操作;否则,为 globbing 操作。如下例:
my @files = <FRED/*>; ##glob
my @lines = <FRED>; ##文件句柄读入
my $name = "FRED";
my @files = <$name/*> ##glob
 
3、目录句柄
从给定目录得到其文件名列表的方法还可以使用目录句柄(directory handle)
打开(使用 opendir 而非 open),从中读入(使用 readdir 而非 readline),关闭(使用 closedir 而非 closemy $dir_to_process = "/etc";
opendir DH, $dir_to_process or die "Cannot open $dir_to_process: $!";
foreach $file(readdir DH) {
print "one file in $dir_to_process is $file\n";
}
closedir DH;
这些列表含有所有的文件名,包括点(.)文件,以及由点(.)开头,或点点(..)开头的文件名
 
readdir 操作返回的文件名没有路径名部分,而只是文件名。
得到的不是/etc/passwd 而是 passwd。
 
4、 递归的目录列表
 File::Find 的库,通过它你可以对递归的目录进行处理。
 
5、删除文件
 
在 Perl 中,我们使用 unlinkunlink "slate","bedrock","lava"; 等价 $ rm slate bedrock lava
unlink glob "*.o";   等价  rm *.o 
返回值 如果数字为 3(个数),则它将所有的三个文件均删除了,如果为 0,则一个也没删除。
 
6、重命名文件
rename "old","new"; 类似Shell中的mv
甚至可以在不同的目录之间操作就跟mv的功能一样
怎样将所有的以.old 结尾的文件重名命名为以 .new 结尾的文件。
foreach my $file (glob "*.old"){
my $newfile = $file;
$newfile =~ s/\ .old$/.new/;
if (-e $newfile){
warn "can't rename $file to $newfile: $newfile exists\n";
}elsif(rename $file, $newfile){
##成功,什么也不做
} else {
warn "rename $file to $newfile failed: $!\n";
}
}
 
7、连接和文件
 符号连接。(也被叫做软连接(soft link),以区别于真或硬连接(hard links))是目录中的一种特殊实体
 link "chicken","egg" or warn "Can't link chicken to egg: $!"; shell 提示符后输入 ln chicken egg 的结果是差不多的。硬连接
 
 symlink "dodgson","carroll"or warn "Can't sysmlink Dodgson to carroll: $!";  shell 中使用 ln -s dodgson carroll 的结果是一样的。软连接
 可以使用 unlink 删除任意类型的连接。
 
8、 创建和删除目录
使用 mkdir 函数:
mkdir "fred",0755 or warn "Cannot make fred directory: $!";
要删除一个空的目录,按照类似于 unlink 函数的方法使用 rmdir 函数:
rmdir 在目录非空时失败。第一遍时,可以尝试使用 unlink 删除目录下的文件,其次再删除现在应当是空的目录。
my $temp_dir = "/tmp/scratch_$$"; #基于进程 ID
mkdir $temp_dir, 0700 or die "cannot create $temp_dir: $!";
#将$temp_dir 作为所有的临时文件存放的地方
unlink glob "$temp_dir/* $temp_dir/."; #将$temp_dir 里面的文件删掉
rmdir $temp_dir;  #将现在是空的目录删掉
 
9、修改权限
Perl 的 chomd 函数也能完成这种任务:
chmod 0755, "fred","barney";
Unix 的 chomd 命令可以使用的符号权限(如+x 或 go=u-w)对 chomd 函数是无效的 File::chmod 模块可以
 
10、改变所有者
my $user = 1004;
my $group = 100;
chown $user, $group, glob "*.o";
 
11、改变时间戳
my $now = time;
my $ago = $now -24*60*60;  #一天的秒数
utime $now, $ago, glob "*" #设成当前访问的,一天之前修改的






10 八 09

前言:这三章都讲的是有关正则表达式和他的使用,通过这三章也明白了很多在SHell或者在VIM中使用正则的一些来由,正则表达式是所有的语言中都有的,但又各有所细小的不同
并且在Perl中有很多特殊的 不错的应用。

第七章 正则表达式
1、不同的正则表达式的实现中,语法会有些微的不同
2、简单模式
要匹配某个模式(正则表达式)和$_的关系,可以将模式放在正斜线(//)之间,如下:
$_ = "yabba dabba doo";
if(/abba/){
  print "It  matched!\n";
}
表达式/abba/将在$_ 寻找这四个字母。如果找到,则返回 true
3、元字符
点(.)是通配符 它可以匹配任何单个的字符,
注意如果是显示句号,英文中跟通配符是一样的,所以这个时候用反斜线进行转义
 
星号(*)表示匹配前一项0次或者多次。
 
.* 将匹配任意字符任意多数。因为任意的字符串均能被匹配上(不包括换行符)。
 
加(+)的意思是可以匹配前面一项的一个或多个:/fred +barney/意思是 fred 和 barney 之间由空格分开,且只能是空格。(空格不是元字符)。
加(+)意指一个或多个,因此至少是一个。
 
问号(?),其含义是前面一个项出现一次,或者不出现。
 
括号(())用来表示分组。
例如,模式/fred+/能匹配上如 fredddddddd,这样的字符串,但这种字符串在实际中没有什么用途。
模式/(fred)+/能匹配上像 fredfredfred 这样的字符串
 
4、选择符
竖线(|),在这种用法中通常被读作"或(or)",意思是匹配左边的或者右边的。
 
5、字符类
字符类,是方括号[]中的一列字符,可以匹配上括号内出现的任意单个字符。它匹配一个字符,但这个字符可以是列中的
任意一个。
我们可以使用连字号(-)来表示某个范围的字母,因此上例也可以写做[a-cw-z]。
 
6、 字符类的简写
A、任何数字的类,[0-9],可以被简写为:\d。
B、\w 被称作 "word"字符:[A-Za-z0-9_]。由字母数字下划线组成。,\w 不能匹配单词,而只能匹配单个字符。为了匹配整个单词,需要后接加号。
C、\s 对于匹配空白(whitespace)将非常方便。它等价于[\f\t\n\r ] :格式符(form-feed)
;制表符(tab),换行符,回车,以及空格符
 
7、补集的简写
以使用[^\d], [^\w],[^\s],其含义分别是,非数字的字符,非 word(记住我们对 word 的定义)的字符,和非空白的字符。也可以使用它们对应的大写形式:\D, \W, \S 来完成。它们将匹配它们对应的小写形式不能匹配上的字符。
 
第八章 正则表达式的应用
1、使用m//匹配
放在一对正斜线(//)里面,如/fred/。这是 m//(模式匹配)的一种简写。同 qw//操作一样,可以使用任何
成对的分隔符。
可以使用 m(fred), m<fred>, m{fred}, m[fred],或者 m,fred,, m!fred!, m^fred^,其它非成对的分隔符也可以.
如果使用正斜线(/)作为分隔符,则可以省略掉前面的 m。
如果想写一个匹配 web URL 开头部分的模式,你可能使用/http:\/\//来匹配 http://。但如果使用 m%http://%将更易于阅读,书写,维护,以及调试。
记住,正斜线不是元字符,如果它不是分隔符,则不需在前面使用反斜线。
 
2、不区分大小写:/i
if(/yes/i) {#大小写无关
  print "In that case, I recommend that you go bowling.\n";
}
 
3、 匹配任何字符:/s
默认情况下,点(.)不匹配换行符,这对于"单行中查找"的问题能很好解决。如果你的字符串中有换行符,并希望点(.)能匹配它们,那可以使用/s 这个修饰符。
 
4、 添加空格:/x
由于/x 允许模式中使用空白,那么模式中的空格,制表符将被忽略。可以在空格前加上反斜线或者使用\t(许多方法中的一种),但匹配空白更常用的方法是使用\s(\s*\s+)。
井号(#)表示后面是注释,如果需要匹配井号,可以使用\#或[#]。注意不要在注释中使用闭分隔符,否则将结束此模式匹配。
/
-? #可选的负号
\d+ #小数点前一个或多个十进制数字
\.? #可选的小数点
\d* #小数点后一些可选的十进制数字
/x #模式结束
 
5、如果在一个模式中需使用不止一个修饰符,可以一个接着一个。其顺序是不重要的。
 
6、锚定(anchors)则可以要求模式在特定的位置进行匹配。
符号^(脱字字符)表示在字符串的开头进行匹配,而符号$则表示在结尾想同时使用这两个锚定来确保匹配整个字符串。一个经常使用的例子是/^\s*$/,它将匹配一个空行(blank l)
 
7、词锚定
词界锚定,\b,是针对单词使用的。如/\bfred\b/可以匹配上单词 fred,但不能匹配 frederick,
非词界锚定为\B。它将在任何非\b 匹配的点上进行匹配。补集
 
8、 绑定操作符,=~$_进行匹配只是默认的行为,使用绑定操作符(=~)将告诉 Perl 将右边的模式在左边的字符串上进行匹配,而非对$_匹配。
my $some_other = "I dream of betty rubble.";
if($some_other =~ /\brub/){
  print "Aye, there's the rub.\n";
}
 
9、模式内可以进行内插 意思就是可以直接用变量
 
10、自动匹配变量 这里提到的三个变量名为: $&, $`, $'。
匹配上的那部分字符串将自动存储在$&之中。
匹配部分的前一部分存放在$`之中,后一部分被存到$'。另一种说法是,$`中含有正则表达式引擎在匹配成功前所找到的变量,而$'为此模式还没有匹配的剩余部分。如果将这三个变量放在一起,你将得到原始字符串:
 
11、已经见过三个数量词:*, +, ?。如果这三个数量词仍不能满足你的要求,那可以使用花括号({}),花括号中有 2 个数字,由逗号隔开,表示前面一项允许重复的次数。
模式/a{5,15}/将匹配 5 个到 15 个 a 中的任意一个(包括 5,和 15)
 
12、优先级
1.在此优先级表的最顶端是括号:(()),在分组和引用内存值的时候使用。括
2.第二级是数量词。这里有星号(*), 加号(+),问号(?)以及由花括号表示的数量词
3.第三级的是锚定和序列(sequence)。锚定包括(^) 表明字符串的开头,($)表明结尾,  (\b)词界符,(\B)非词界符。
4.优先级最低的是竖线(|),表示或。
 
第九章 使用正则表达式处理文件
1、 使用 s///进行替换"查询并替换"
s/Wilma/Betty/#用 Wilma 替换 Betty
 
2、 使用/g 进行全局替换
 
3、可以使用其它的分隔符
s{fred}{barney};
s[fred](barney);
s<fred>#barney#;
 
4、替换操作中还可以使用/i, /x,/s,这些在普通的模式匹配中已经出现过的修饰符。
 
5、同 m//一样,我们也可以通过使用绑定操作符改变 s///的替换目标:
$file_name =~ s#^.*###s;#将$file_name 中所有的 Unix 类型的路径去掉
 
6、大小写转换
\U 要求紧接着的均是大写:
\L 要求紧接着的均是小写
 
使用小写形式时(\l\u),只作用于下一个字符:
 
s/(fred|barney)/\U$1/gi;  #$_现在是 “ I saw BARNEY with FRED.”
 
7、使用正则表达式的操作是 split,它根据某个模式将字符串分割开。这对于由制表符分割开,冒号分割开,空白分割
开,或者任意字符分割开的数据是非常有用的
@fields = split /separtor/, $string;
这里有一条规则:开头的空元素会被返回,但结尾的空元素被丢弃◆
 
8、Join函数
join 函数不使用模式,但它完成同 split 相反的操作:split 将一个字符串分割开,而 join 函数将这些分割的部分组合成一个整体。join 函数类似于:
my $result = join $glue, @pieces;
 
my $x = join ":" , 4, 6, 8, 10, 12; #$x 为 "4:6:8:10:12"
 
9、更强大的正则表达式
A、 非贪婪的数量词
效率执行更高
回退(backtracking)操作更少
在原有的贪婪数量词后加问号就是非贪婪数量词
由于加号的非贪婪类型是 +?,星号的为 *?,你可能已经意识到剩下的两种数量词其对应的类型也是类似的。花括号的非贪婪类型看起来一样,只是在闭花括号后有一个问号,如{5,10}?或者{8,}?◆。甚至问号数量词也有非贪婪类型:??。它匹配一次或者 0 次,但倾向于匹配 0 次。
 
B、匹配多行文本
通常,正则表达式是针对单行文本的。
 但/m 这个正则表达式选项允许它们根据内部的换行符进行匹配。 (将m 看作多行(think m for multiple lines)。)
 
C、更新大量文件
命令行中
$perl –p –i.bak –w –e 's/Randall/Randal/g' fred*.dat
 
D、在开括号后面加上一个问号和冒号,(?:) ,其作用事告诉 Perl 括号只是分组的作用。






9 八 09

前言:最近也不知道为什么,总是缺少激情和动力,很快会好的,我的Perl学习计划,刚开始可不能半途而废,今天周六,突然狠下心半夜了也要解决三章。这三章完全跟前面三章的感觉不一样,前三章应该是很基础的,可能学每种语言都会遇到想类似的过程,而这三章则完全是Perl的特点,发现这本书还是挺不错的,他会解释每一个规则是如何来的,解释得跟这门语言一样自然,从这门语言也看到了其它语言的那些规定的符号的来源。

第四章 子程序
 
1、要定义自己的子程序,使用关键字 sub,子程序的名字(无&这个符号),组成子程序的缩进的代码块(花括号中)
sub marine {
$n + = 1; #全局变量$n
print "Hello, sailor number $n!\n";
}
2、子程序的定义可以在程序的任意位置
3、两个子程序有相同的名字,那后一个将覆盖前一个
4、使用子程序的名字(带有&)来调用子程序
5、返回值为最后一个被计算的表达式。
6、的警告信息 "a useless use of addition in a void context." 术语 void context 是说其值未被存于变量或者被别的方式使用。
7、将参数列表传给子程序中的方法是,在程序名后面接括号,括号内存放参数列表
$n = &max(10,15);#此子程序有 2 个参数
参数存放在@_这个变量中。
此子程序参数的第一个值存放在$_[0]中,第二个存放在$_[1],依次类推。
 
8@_是子程序的一个私有变量
一个全局变量@_,它将在此子程序调用前存储起来,当子程序调用完成后,其早当将参数传递给子程序时不用担心它会影响此程序中其它子程序的@_这个变量的值。
子程序递归和嵌套调用时,每一次调用将得到新的@_,
 
9、默认情况下,Perl 中所有变量都是全局的;也就是说,这些变量可以在程序的任意部分使用。你也可以任意时候使用 my创建私有变量:
sub max {
my($m,$n);  		#新的,私有变量
($m,$n) = @_;  	#新的,私有变量
if($m > $n) {$m} else{$n}
}if 代码块内部,其语句没有分号。通常仅当此代码块仅包含一条语句时才省略此分号。
 
10、将变量的作用域限制在一页,或者几行代码中,能加速开发和测试。
 
11、如果没有使用括号,my 仅定义一个变量
my ($num) = @_; #列表 context, 同($sum) = @_;
my $num = @_; #标量 context,同$num = @_;
 
12、Perl 是一种宽容的语言
 
13、告诉 Perl 进行更严格的语法检测,需要在程序顶端 use strict(或者在任意块或者文件中,如果你需要在此部分使用它):
use strict; #迫使采用更严格的检测
 
14、:如果子程序和 Perl 一个内嵌程序同名,则必须使用&来调用它。
,实际的使用规则是:除非知道 Perl 所有的内嵌函数,否则函数调用时都应当使用&。
 
第五章 输入输出
1、标准输入设备输入,使用<STDIN>,为行输入操作
chomp($line=<STDIN>)
行输入操作在到达文件的结尾时将返回 undef。对于从循环退出时非常方便。
while (defined($line = <STDIN>)) {
print "I saw $line";
}
不能将 chomp 操作插入条件表达式中.
 
2、另一种方法是使用尖括号输入(diamond operator)<>
尖括号操作(<>)是一种特殊的行输入操作。
while(<>){
chomp;
print "It was $_ that I saw!\n";
}
chomp 使用了默认参数,chomp 将对$_操作
 
3、标准输出  print 操作将传给它的依次输出到标准输出设备中,一个接着一个。
print @array; #打印出元素的列表 没有空格
print "@array"#打印一个字符串(包含一个内插的数组) 由空格分开
 
print <>; # 'cat' 的源程序
print sort <>; #'sort' 的源程序
 
4printf 函数有一个格式字符串(format string),后接需要输出的字符串列表。
格式字符串中有一些被称作格式符(conversion)的东西;每一个格式符由百分号(%)开头,由字母结束。
%d 为十进制整数
%s 是针对字符串的
%f 根据需要进行截尾
%% 要输出一个百分号
printf "%6f\n", 42;#输出为 ○ ○○○ 42(○此处指代空格)
如果宽度值为负数,则为左对齐(对于所有的格式符):
print "%-15s\n" , "flintstone" #输出为 flintstone○ ○○○
 
5、文件句柄(filehandle)是 Perl 程序 I/O 连接的名字,是 Perl 和外界的纽带
文件句柄的所有字母均大写
Perl 自身有六个文件句柄:STDINSTDOUTSTDERR,DATA,ARGVARGVOUT
 
Perl 再请求操作系统来建立同外部的连接。
open CONFIG, "dino";
open CONFIG, "<dino";     #前面两个一样 都是输入操作,类似于SHELL中的<dino
open BEDROCK, ">fred";   #输出操作 输出内容到fred中
open LOG, ">>logfile";      #追加到logfile
注意空格:如果文件名前有空格,Perl 将忽略它。
Perl 5.6后
支持三种参数类型
open CONFIG, "<" , "dino";
open BEDROCK, ">" , $file_name;
open LOG, ">>" , &logfile_name();
增加安全性
 
6、关闭文件句柄
当结束一个文件句柄时,你可以如下这样关闭它:
close BEDROCK;
如果希望程序更加整洁,则每一个 open 都应当使用一个 close。
最好在不使用一个文件句柄时就立刻将它关闭,无论程序是否立即结束
关闭文件句柄将清空缓存,并释放文件的锁,由于可能有人会使用某个文件。
 
7、利用 die 函数来创建我们自己的严重错误。
die 函数将打印出你给它的消息(利用标准错误流),并确保程序退出时为非零(nonzero)的退出状态(exit status)
。
if(!open LOG, ">>logfile"){
die "Cannot create logfile:$!";
}
$!将告诉你原因
die 还会为你做一件事:他会自动将 Perl 程序的名字和行数输出在消息的末尾,因此能轻易的辨别出是哪一个 die 引起的错误。
 
8warn 函数像 die 那样工作,除了最后一步,它不会从程序中退出。它也能加上程序的名字和行号,并把消息输出到标准错
误那里(standard error),和 die 一样。
 
9、写出(>)或追加的(>>)的文件句柄,可以和 printprintf 结合使用,如:
print LOG "Captain's log, stardate 3.14159\n";   #输出到 LOG 中
printf STDERR "%D percent complete.\n", $done/$total * 100;
 
 
第六章 哈希
1、哈希:是一种数据结构和数组类似,,可以将值存放到其中,或者从中取回值,其索引是名字而不像数组的数字 。
keys是唯一的字符串
2keys 是唯一的,但 values 可以重复。hash 的 value 可以是数字,字符串,undef,或者它们的混合◆,但 key 是唯一的。
3、要访问 hash 元素,可以使用下面的语法:
$hashname{$some_key}
 
foreach $person (qw<barney fred>){
print "I've heard of $person $family_name{$person}.\n";
}
 
4、要引用整个 hash,使用百分号("%")作为前缀
5、这里有一条规则:最后一次赋值获胜。也就是说,列表中后面的元素将覆盖掉以前的元素(相同 key时)
6、使用大箭头号"=>"进行赋值
my %last_name=(
  "fred" => "flintstone",
  "dino" => undef,
  "barney" => "rubble"
  );
 
 7keys 函数会返回此 hash 的所有 keysvalues 函数将返回所有的 values8my %hash = ("a"=>1,"b"=>2,"c"=>3);
my @k = keys %hash;
my @v = values %hash;
 
Perl 并不维护 hash 中元素的顺序。
 
8each函数:当对同一个 hash 函数进行一次迭代时,将返回下一个 key/value 对,直到所有的元素均被访问。e 对,则 each 函数将返回空表。
9、通常用法
很容易知道 hash 的某个元素是 true 还是 false,像下面这样:
if($books{$someone}){
print "$someone has at least one book checked out.\n";
}
10、要查看 hash 中是否存在某个 key(某人是否有借书卡)
,可以使用 exists 函数,如果 hash 中存在此 key,则返回 true,这是否有对应的 value 无关:
if(exists $books{$dino}){
print "Hey, there's a libaray card for dino!\n";
}
 
11delete 函数将某个给定的 key(包括其对应的 value)从 hash 中删除。
(如果不存在这个 key,则什么也不做;不会有警告或者错误信息。)
my $person = "betty";
delete $books{$person}; #将$person 的借书卡删除掉