perl笔记
1、与脚本语言一样,Perl不需要编译器和链接器来运行代码,你要做的只是写出程序并告诉Perl来运行而已。这意味着Perl对于小的编程问题的快速解决方案和为大型事件创建原型来测试潜在的解决方案是十分理想的。
2、单引号字符串与双引号字符串有两个区别,一是没有变量替换功能,二是反斜线不支持转义字符,而只在包含单引号和反斜线时起作用。单引号另一个特性是可以跨多行
3、惯用C的程序员要注意,在PERL中,字符串的末尾并不含有隐含的NULL字符,NULL字符可以出现在串的任何位置
4、字符串和数值的互相转换:若字符串中含有非数字的字符,则从左起至第一个非数字的字符
5、整型的限制:
PERL实际上把整数存在你的计算机中的浮点寄存器中,所以实际上被当作浮点数看待。在多数计算机中,浮点寄存器可以存贮约16位数字,长于此的被丢弃。整数实为浮点数的特例。
6、整数比较操作符,字符串比较操作符
7、数组的输出:
(1) @array = (1, 2, 3);
print (@array, "\n");
结果为:
123
(2) @array = (1, 2, 3);
print ("@array\n");
结果为:
1 2 3
2、单引号字符串与双引号字符串有两个区别,一是没有变量替换功能,二是反斜线不支持转义字符,而只在包含单引号和反斜线时起作用。单引号另一个特性是可以跨多行
3、惯用C的程序员要注意,在PERL中,字符串的末尾并不含有隐含的NULL字符,NULL字符可以出现在串的任何位置
4、字符串和数值的互相转换:若字符串中含有非数字的字符,则从左起至第一个非数字的字符
5、整型的限制:
PERL实际上把整数存在你的计算机中的浮点寄存器中,所以实际上被当作浮点数看待。在多数计算机中,浮点寄存器可以存贮约16位数字,长于此的被丢弃。整数实为浮点数的特例。
6、整数比较操作符,字符串比较操作符
7、数组的输出:
(1) @array = (1, 2, 3);
print (@array, "\n");
结果为:
123
(2) @array = (1, 2, 3);
print ("@array\n");
结果为:
1 2 3
(3)列表范围
(1..10) = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
(2, 5..7, 11) = (2, 5, 6, 7, 11)
(2.1..5.3) = (2.1, 3.1 ,4.1, 5.1)
(4.5..1.6) = ()
(2, 5..7, 11) = (2, 5, 6, 7, 11)
(2.1..5.3) = (2.1, 3.1 ,4.1, 5.1)
(4.5..1.6) = ()
(4)子数组
@array = (1, 2, 3, 4, 5);
@subarray = @array[0,1]; # @subarray = (1, 2)
@subarray2 = @array[1..3]; # @subarray2 = (2,3,4)
@array[0,1] = ("string", 46); # @array =("string",46,3,4,5) now
8、列表/数组的长度
当数组变量出现在预期简单变量出现的地方,则PERL解释器取其长度。
@array = (1, 2, 3);
$scalar = @array; # $scalar = 3,即@array的长度
($scalar) = @array; # $scalar = 1,即@array第一个元素的值
9、字符串中的方括号和变量替换
"$var[0]" 为数组@var的第一个元素。
"$var\[0]" 将字符"["转义,等价于"$var". "[0]",$var被变量替换,[0]保持不变。
"${var}[0]" 亦等价于"$var" ."[0]"。
"$\{var}"则取消了大括号的变量替换功能,包含文字:${var}.
10、写文件
形式为:
open(OUTFILE, ">outfile");
print OUTFILE ("Here is an output line.\n");
注:STDOUT、STDERR为标准输出和标准错误文件,通常为屏幕,且不需要打开。
11、子程序中局部变量的定义有两种方法:my和local。其区别是:my定义的变量只在该子程序中存在;而local定义的变量不存在于主程序中,但存在于该子程序和该子程序调用的子程序中(在PERL4中没有my)。
@subarray = @array[0,1]; # @subarray = (1, 2)
@subarray2 = @array[1..3]; # @subarray2 = (2,3,4)
@array[0,1] = ("string", 46); # @array =("string",46,3,4,5) now
8、列表/数组的长度
当数组变量出现在预期简单变量出现的地方,则PERL解释器取其长度。
@array = (1, 2, 3);
$scalar = @array; # $scalar = 3,即@array的长度
($scalar) = @array; # $scalar = 1,即@array第一个元素的值
9、字符串中的方括号和变量替换
"$var[0]" 为数组@var的第一个元素。
"$var\[0]" 将字符"["转义,等价于"$var". "[0]",$var被变量替换,[0]保持不变。
"${var}[0]" 亦等价于"$var" ."[0]"。
"$\{var}"则取消了大括号的变量替换功能,包含文字:${var}.
10、写文件
形式为:
open(OUTFILE, ">outfile");
print OUTFILE ("Here is an output line.\n");
注:STDOUT、STDERR为标准输出和标准错误文件,通常为屏幕,且不需要打开。
11、子程序中局部变量的定义有两种方法:my和local。其区别是:my定义的变量只在该子程序中存在;而local定义的变量不存在于主程序中,但存在于该子程序和该子程序调用的子程序中(在PERL4中没有my)。
12、面向对象:
.类是一个Perl包,其中含提供对象方法的类。
.方法是一个Perl子程序,类名是其第一个参数。
.对象是对类中数据项的引用。
13、创建类:
(1)一个模块就是一个包,一个包就是一个类
-----包的缺省扩展名为".pm",即Perl Module
-----“1;”为最后一行。这是Perl包的必需条件
(2)构造函数:new()方法是对象的构造函
sub new {
my $this = {}; # Create an anonymous hash, and #self points to it.
#初始化操作
bless $this; # Connect the hash to the package class_name.
return $this; # Return the reference to the hash.
}
(3)"->"操作符调用方法
(4)析构函数
sub DESTROY {
#
# Add code here.
#
}
.类是一个Perl包,其中含提供对象方法的类。
.方法是一个Perl子程序,类名是其第一个参数。
.对象是对类中数据项的引用。
13、创建类:
(1)一个模块就是一个包,一个包就是一个类
-----包的缺省扩展名为".pm",即Perl Module
-----“1;”为最后一行。这是Perl包的必需条件
(2)构造函数:new()方法是对象的构造函
sub new {
my $this = {}; # Create an anonymous hash, and #self points to it.
#初始化操作
bless $this; # Connect the hash to the package class_name.
return $this; # Return the reference to the hash.
}
(3)"->"操作符调用方法
(4)析构函数
sub DESTROY {
#
# Add code here.
#
}
14、方法:
Perl类的方法(成员函数)只不过是一个Perl子程序而已;方法的第一个参数为对象或其被引用 的包。Perl有两种方法:静态方法和虚方法。
(1)静态方法第一个参数为类名,一般忽略掉第一个参数
------构造函数即静态方法
(2)虚方法第一个参数为对象的引用
-----虚方法通常首先把第一个参数shift到变量self或this中
,然后将该值作普通的引用使用。
-----通常为此形式:my $this = shift 或是my $this = shift @_
15、方法的输出
输出方法需要Exporter模块,在包的开始部分加上下列三行:
package package_name;#和当前定义的模块文件(.pm)同名
require Exporter;
@ISA = qw (Exporter);
@EXPORT = qw (method1,method2,...);#把自己的类方法列在@EXPORT数组中
-----Perl类的继承是通过@ISA数组实现的;@ISA数组含有类(包)名,当一个方法在当前包中未找到时就到@ISA中的包去寻找
16、创建对象:
$obj_name = new calss_name;
17、shift返回列表的当前第一个值,并缩短列表1个大小。
18、函数substr(string,offset,length)用法:
-------当length为负值时候,返回从offset开始的值,但是不包括最后|length|个字符。
19、perl中的引用有些像unix下面的连接文件,只有所有的引用被去掉,perl才会释放这个变量的空间。
20、多维数组:
创建:$abc=[["00","01"],["10","11"]];
使用:$var=$abc->[1][1];
21、常量:标量常量、列表常量、哈希常量
22、箭头运算符(->):
(1):访问引用中的数据元素
(2):对象中使用,通过它来调用一个对象(或实例)的方法
23、defined EXPR
Returns a Boolean value telling whether EXPR has a value other than the undefined value undef
24、一个光块{}就是一个循环(但是不是真正意义上的循环,因为嵌套的光块不会循环执行),因此可以用last退出
25、perl对大小写是敏感的,如常量大些和小写会有不同的警告信息,一些关键字的大小写也会影响其意义。
26,声明常量:
(1)e.g. use constant PI => 4 * atan2(1, 1);
(2)a reference may be declared as a constant, the reference may point to data which may be changed。
27,函数运行参数:
@ARGV 表示命令行参数(选项参数不计在内,如-h,--help之类的)
Perl类的方法(成员函数)只不过是一个Perl子程序而已;方法的第一个参数为对象或其被引用 的包。Perl有两种方法:静态方法和虚方法。
(1)静态方法第一个参数为类名,一般忽略掉第一个参数
------构造函数即静态方法
(2)虚方法第一个参数为对象的引用
-----虚方法通常首先把第一个参数shift到变量self或this中
,然后将该值作普通的引用使用。
-----通常为此形式:my $this = shift 或是my $this = shift @_
15、方法的输出
输出方法需要Exporter模块,在包的开始部分加上下列三行:
package package_name;#和当前定义的模块文件(.pm)同名
require Exporter;
@ISA = qw (Exporter);
@EXPORT = qw (method1,method2,...);#把自己的类方法列在@EXPORT数组中
-----Perl类的继承是通过@ISA数组实现的;@ISA数组含有类(包)名,当一个方法在当前包中未找到时就到@ISA中的包去寻找
16、创建对象:
$obj_name = new calss_name;
17、shift返回列表的当前第一个值,并缩短列表1个大小。
18、函数substr(string,offset,length)用法:
-------当length为负值时候,返回从offset开始的值,但是不包括最后|length|个字符。
19、perl中的引用有些像unix下面的连接文件,只有所有的引用被去掉,perl才会释放这个变量的空间。
20、多维数组:
创建:$abc=[["00","01"],["10","11"]];
使用:$var=$abc->[1][1];
21、常量:标量常量、列表常量、哈希常量
22、箭头运算符(->):
(1):访问引用中的数据元素
(2):对象中使用,通过它来调用一个对象(或实例)的方法
23、defined EXPR
Returns a Boolean value telling whether EXPR has a value other than the undefined value undef
24、一个光块{}就是一个循环(但是不是真正意义上的循环,因为嵌套的光块不会循环执行),因此可以用last退出
25、perl对大小写是敏感的,如常量大些和小写会有不同的警告信息,一些关键字的大小写也会影响其意义。
26,声明常量:
(1)e.g. use constant PI => 4 * atan2(1, 1);
(2)a reference may be declared as a constant, the reference may point to data which may be changed。
27,函数运行参数:
@ARGV 表示命令行参数(选项参数不计在内,如-h,--help之类的)
$ARGV[0]表示第一个参数
$#ARGV 空数组的返回值为-1;
$#ARGV 空数组的返回值为-1;
28, open(FD,">>file_name")如果file_name不存在的话,会自动创建此文件
29,$#array_name返回数组最后一个元素的下标
print $list[$_] foreach 0 .. $max;#$_是默认的下标输入
30,defined用法:如果var有值,则defined(var)返回1
31,Hash元素的增删:
1、一定要使用delete函数来删除关联数组的元素,这是唯一的方法。
2、一定不要对关联数组使用内嵌函数push、pop、shift、unshift及splice,因为其元素位置是随机的。
1、一定要使用delete函数来删除关联数组的元素,这是唯一的方法。
2、一定不要对关联数组使用内嵌函数push、pop、shift、unshift及splice,因为其元素位置是随机的。
32, use lib LIST;
is almost the same as saying
BEGIN { unshift(@INC, LIST) };
The "no lib" statement deletes all instances of each named directory from @INC
33,require:
用require函数可以把程序分割成多个文件并创建函数库。例如,在myfile.pl中有定义好的Perl函数,可用语句require ("myfile.pl"); 在程序中包含进来。当Perl解释器看到这一语句,就在内置数组变量@INC指定的目录中寻找文件myfile.pl。
如果找到了,该文件中的语句就被执行,否则程序终止并输出错误信息。
假设目录/u/perldir中存有你的Perl子程序库,子程序mysub存贮在文件mysub.pl中。现在来包含上该文件:
unshift (@INC, "/u/perldir");
require ("mysub.pl");
34,格式:
格式 值域含义
@<<< 左对齐输出
@>>> 右对齐输出
@||| 中对齐输出
@##.## 固定精度数字
@* 多行文本
每个值域的第一个字符是行填充符,当使用@字符时,不做文本格式化。对文本的格式化稍后来讲。
在上表中,除了多行值域@*,域宽都等于其指定的包含字符@在内的字符个数,例如:
@###.##
表示七个字符宽,小数点前四个,小数点后两个。
is almost the same as saying
BEGIN { unshift(@INC, LIST) };
The "no lib" statement deletes all instances of each named directory from @INC
33,require:
用require函数可以把程序分割成多个文件并创建函数库。例如,在myfile.pl中有定义好的Perl函数,可用语句require ("myfile.pl"); 在程序中包含进来。当Perl解释器看到这一语句,就在内置数组变量@INC指定的目录中寻找文件myfile.pl。
如果找到了,该文件中的语句就被执行,否则程序终止并输出错误信息。
假设目录/u/perldir中存有你的Perl子程序库,子程序mysub存贮在文件mysub.pl中。现在来包含上该文件:
unshift (@INC, "/u/perldir");
require ("mysub.pl");
34,格式:
格式 值域含义
@<<< 左对齐输出
@>>> 右对齐输出
@||| 中对齐输出
@##.## 固定精度数字
@* 多行文本
每个值域的第一个字符是行填充符,当使用@字符时,不做文本格式化。对文本的格式化稍后来讲。
在上表中,除了多行值域@*,域宽都等于其指定的包含字符@在内的字符个数,例如:
@###.##
表示七个字符宽,小数点前四个,小数点后两个。
35,管道操作:
输出命令管道的语法如下:
open(FILEHANDLE,|COMMAND);
输入过滤器的语法如下:
open(FILEHANDLE, COMMAND|);
输出命令管道的语法如下:
open(FILEHANDLE,|COMMAND);
输入过滤器的语法如下:
open(FILEHANDLE, COMMAND|);
36,here文档:
here 文档定义一个字结束符用紧接着<<的符号定义,这个符号可以用双引号或单引号括起它支持插值。
例1: my $Price = 'right';
#here documents
print<<EOF_SJ;
The price is $Price.
EOF_SJ
here 文档定义一个字结束符用紧接着<<的符号定义,这个符号可以用双引号或单引号括起它支持插值。
例1: my $Price = 'right';
#here documents
print<<EOF_SJ;
The price is $Price.
EOF_SJ
#此处必须有回车,因为他是一行为单位的
If the terminating identifier is on the last line of the program, you must be sure
there is a newline after it; otherwise, Perl will give
the warning Can't find string terminator "END" anywhere before EOF....
例2:帮助使用:
(1) use constant USAGE => <<USAGE;
.....contents of help
USAGE
(2)print USAGEMSG;#打印contents of help
【Here文档仅仅是引号的一种可替代的形式。在你可以使用单引号或者双引号的地方就可以使用Here文档。】
37,可执行文件产生:
perlcc hello.pl # Compiles into executable 'a.out'
perlcc -o hello hello.pl # Compiles into executable 'hello'
38,perl中调用C代码:Inline关键字
use Inline C => <<'END_C';
void greet() {
printf("Hello, world\n");
}
END_C
greet;
在 windows 下,可以调用 windows API:
use Inline C => <<'END_C';
void greet() {
MessageBox( NULL, "Hello, world", "windows", MB_OK );
}
END_C
greet;
there is a newline after it; otherwise, Perl will give
the warning Can't find string terminator "END" anywhere before EOF....
例2:帮助使用:
(1) use constant USAGE => <<USAGE;
.....contents of help
USAGE
(2)print USAGEMSG;#打印contents of help
【Here文档仅仅是引号的一种可替代的形式。在你可以使用单引号或者双引号的地方就可以使用Here文档。】
37,可执行文件产生:
perlcc hello.pl # Compiles into executable 'a.out'
perlcc -o hello hello.pl # Compiles into executable 'hello'
38,perl中调用C代码:Inline关键字
use Inline C => <<'END_C';
void greet() {
printf("Hello, world\n");
}
END_C
greet;
在 windows 下,可以调用 windows API:
use Inline C => <<'END_C';
void greet() {
MessageBox( NULL, "Hello, world", "windows", MB_OK );
}
END_C
greet;
39,安装CPAN(PM包):
【1】unix下:
1,解压tar.gz包
2,perl Makefile.PL
3,make test(测试)
4,make install
【1】unix下:
1,解压tar.gz包
2,perl Makefile.PL
3,make test(测试)
4,make install
40,。在 perl 中,一个对象类只不过是一个包,而一个对象实例只不过是一个引用。不过这个引用是通过函数bless创建的一类特殊引用。
41,perl中的“真假”:
数字0为假。
空的字符串(“”)和字符串“0”为假。
未定义值undef为假。
其他东西均为真。
42,一行的结束:
“一行输入”通常是指发现第一个行尾序列之前的文本流。在UNIX中,
行尾是一个换行符( ASCII 10);在DOS和Windows中,它是回车符与换行
符的序列(ASCII 13、10)。这个默认行尾值可以被Perl进行操作,产生某些
有趣的结果。
43,Perl中的flush 缓冲区,在需要缓冲的地方调用以下语句:
$|++;
$! If used numerically, yields the current value of the C
errno
variable
@ARGV The array @ARGV
contains
the command-line arguments intended for the script.
@_ Within
a subroutine the array @_
contains
the parameters passed to that subroutine.
45, Array to scalar
当数组变量出现在预期简单变量出现的地方,则PERL解释器取其长度。
46,BEGIN和END
BEGIN,END。它们可以分别包含一组脚本,用于程序体运行前或者运行后的执行,和所在位置无关!
47,@INC
Perl的@INC数组类似于shell程序的PATH环境变量。就如同PATH包含了用于搜索可执行程序的目录列表一样,@INC包含了可以装载perl模块和库文件的目录
48,字符编码,乱码处理:Encode模块的decode、encode函数;
use Encode; $dat="测试文本"; $str=decode("gbk",$dat); print $dat,"\n"; @chars=split //,$str; foreach $char (@chars) { print encode("gbk",$char); }