Perl语言入门学习笔记(前六章)

Perl语言入门,俗称小骆驼书,是Perl的入门教程.
Perl有很多类似shell的特殊变量,特殊用法,很多需要记忆的东西.通读之后还有很多没有记住的内容,所以又看一遍,把一些大体的内容,特殊用法,注意问题等需要记忆的东西整理出来,以备查阅.


#!/usr/bin/perl
小骆驼书

第二章

整数直接量可以用_分割,如 61_298_040_283
乘幂运算符 **
字符串连接 .
字符串重复 x example:"fred" x 3; #复制次数使用前取整,小于1时得到空字符串
打开警告信息:
1. perl -w perl_program
2. #!/usr/bin/perl -w
3. use warnings;
4. use diagnostics; 显示警告信息和详细的诊断信息
print 输出一系列用逗号隔开的值
进行变量内插时,Perl会尽可能使用最长且合法的变量名称,否则应该用${var_name}方式,或者分割字符串
操作符优先级,查看 perldoc perlop
数值比较: == != <  >  <=  >=
字符串比较: eq ne lt gt le ge
chomp 是函数,仅删除字符串后的一个换行符。输入分割符($/)控制输入
undef 代表未定义的值,会被当成 0 空字符串 假值
defined 测试是否为undef

第三章

数组的命名空间和标量的命名空间是分开的 $fred和 @fred, $fred[0] 不相关
$[ 特殊变量可以控制数组的开始下标。默认为0。可以查看perlvar中的特殊变量
特殊索引:$#rocks为@rocks最后一个下标值,如$rocks[$#rocks] == $rocks[-1]
负值索引为从后起的索引,-1为最后一个索引
列表直接量:范围操作符: ..
(1, 2, 3)
(1..5) == (1.7..5.7)
(5..1) #空列表
qw表示"quoted word"或"quoted by whitespace". qw(fred barney) == ("fred", "barney") 不过qw内相当于单引号,不能变量内插和转义,空白字符会被舍弃 qw/.../ qw#...# qw<...>为同义,定界符之内使用定界符需要转义
($fred, $barney) = ($barney, $fred); #互换两者的值
()为空列表,列表内只能是标量,不能包含其他数组。
$fred = pop @array;#同 pop(@array);
push @array, 1..10;#同 push(@array, 1..10);
$fred = shift(@array);
unshift @array, 1..3;
数组内插到字符串中时,会在各元素之间添加分隔用的空格,空格是由$" 内置变量控制".
foreach $rock (@rocks){}
foreach (@rocks){print $_;}
sort, reverse 不会修改原数组,所以要保存结果。 @fred = reverse @fred;
在列表上下文中,@array 将返回数组所有元素连成的字符串,而在标量上下文中将返回数组的元素个数
强制使用标量上下文:scalar @rocks
$line = <STDIN>; #读取一行
@lines = <STDIN>; #读取所有的行

第四章

子程序:sub name {code here} 使用&name();调用
perl子程序最后一次运算的结果自动成为返回值
子程序参数列表:@_ 类似与javascript中的arguments参数
perl的变量默认为全局变量,通过my 创建私有的词法变量,如 my($m, $n) = @_;
my 不使用括号时,只能声明单个词法变量
可以用use strict; 强制使用严格的语言规则
调用子程序时,当在调用之前声明子程序,且子程序名称不与perl内置函数同名时,可以省略& 以及括号
在列表上下文中调用子程序,就能返回列表值.可以使用wantarray函数来判断子程序是在标量上下文还是列表上下文中被执行
可以使用state声明持久性私有变量.类似C中的静态变量,在子程序的多次调用间保留该变量的值.如 state $n = 0; 但是目前在列表上下文中初始化 state 变量是被禁止的.另外,使用state应该使用use 5.010;默认版本不支持

第五章

当把<STDIN>作为while或foreach的条件表达式时,会读入一行并自动存入$_,其他地方不会自动存入"老地方"变量. 语法:while (<STDIN>){print "I saw $_ ";}
钻石操作符<>,为行输入的特殊情况,从命令行参数的文件中读取输入,若为空则从标准输入流读取
@ARGV 数组保存调用程序时的参数, $0 保存程序的文件名
print 的调用如果看起来像一个函数调用,那么它就是一个函数调用. print (2+3)*4; 会输出5,将2+3作为参数
printf 类似C的同名函数,如果输出数组,则格式字符串里的格式数目须等于数组元素数目,可以用 "%10sn" x @items; 动态生成格式字符串
六个perl保留文件句柄:STDIN STDOUT STDERR DATA ARGV ARGVOUT
打开文件句柄方法: open CONFIG, "dino"; open config, "<dino"; open LOG, ">>logfile";也可以用三个参数的写法: open CONFIG, "<", "dino"; open LOG, ">>", $filepath;
die 结束运行并输出错误信息,系统错误信息保存在$! 变量中.只在系统服务请求失败后输出 $! 内容.die还会将出错的程序名和行号加在信息的最后.
行输入操作符由尖括号(真正的行输入操作符)和用来输入的文件句柄组成.
print, printf 向文件输出时,在后面跟文件句柄,然后是输出的内容.文件句柄与输出内容间无逗号.如: print LOG "Captain's log, somethingn";
这两种写法也可以: printf (STDERR "%d percent complete.n", $done/$total * 100); OR printf STDERR ("%d percent complete.n", $...);
print, printf 的默认输出句柄为STDOUT. 可以用select 改变默认文件句柄. 但处理完毕后最好改回STDOUT. $| 变量设置为1,则输出时立刻刷新缓冲区.
use 5.010; 来使用Perl 5.10版本. 从此版本之后有say函数.类似 println
第六章
哈希变量用%做前缀.赋值可以用 $hashname{'fred'}='sth';  or  %hashname = ("foo",10,"bar",122);
@array = %hash;列表上下文中,会自动松绑成简单的键值对的列表.在标量上下文的 $scalar = %hash; 将返回hash的内部调试用的字符串(如:3/8, 可以作为布尔值判断是否为空.).
%new_hash = reverse %any_hash; 将哈希松绑后翻转再赋值.所以结果是键值互换的hash. 如果hash值不唯一,则有一部分数据会丢失(后边覆盖前边,但是hash内部无固定顺序).
使用胖箭头赋值更常用:my  %some_hash = ("fred" => "this is fred", "foo" => "foo, aha", "bar" => "Not that bar!");类似PHP的数组.
keys 将返回键列表,values 返回值列表. 顺序不可预测,但是两个函数顺序对应.
while ( ($key, $value) = each %hash){code here...} 可以用此方法便利hash.遍历顺序与keys 的顺序相同.keys values 能重置定位器,所以不要在遍历时使用.
foreach $key (sort keys %hash){ $value = $hash{$key}; code here...} 也可以用此方法遍历hash.
exists 判断hash中是否有某个键,而与键对应的值无关. if (exists $hash{"dino"} ){...}
delete 删除指定键及其对应的值. delete $books{'betty'}; 若不存在,直接结束.
%ENV代表系统的环境变量. 可以用$ENV{PATH} 输出bash的环境变量中PATH变量的值.
posted @ 2011-02-23 12:44  leetom  阅读(250)  评论(0编辑  收藏  举报