perl笔记
来源:互联网 发布:怎么查淘宝买家信誉 编辑:程序博客网 时间:2024/05/22 00:22
/*
所有笔记都是根据个人对某知识点了解程度而做适当记录,以备复习。不是针对某知识点系统记录、讲解。
*/
1、last相当于break next相当于continue
2、“真”的定义
A、未定义的变量为false
B、空字符创为false
C、值为0为false
D、其他情况为真
3、defined函数测试变量是否有某个值。
4、简单关系运算符
== eq
!= ne
< lt
<= le
> gt
>= ge
5、十六进制表时必须用0x,而不能用0X。(x的大小写区别)
6、perl允许在数字中使用下划线 eg:1_333_258
7、在双引号中分离变量,可使用{}
8、perl运算符:
. 字符串串联 eg: $full_name = $first." ".$last
** 幂 eg: $div = 12**2
x 重复 eg: $no = "no" x 3
9、open如果打开成功,返回true,否则返回undef
10、从文件读入空行时,读入的是\n,而不是“”
11、在线文档
perldoc -f chomp
perldoc -f defined
perldoc perlsyn #基本语法信息
perldoc perllop #关于perl运算符的信息
12、决定数组中的元素个数:$#array
注意注意:表达式$#array返回的是数组的最后元素的索引。对于单元素数组,$#array 返回0. 对于空数组,$#array返回-1.
eg:for(my $index = 0; $index <= $#array; $index++); 使用 <= 而不是 <
13、带有“黑洞”的数组
my @array = (1); $array[3] = 100;
@array元素为(1,undef,undef,100);
14、引用词常犯错误
my @name = qw(xin lang shen zhen); #qw列表中不能有逗号
15、操纵数组结尾
push(@array,1); #数组结尾插入1
$last_element = pop(@array); #pop数组最后一元素
$first_element = shit(@array); #pop数组第一个元素
unshit(@array,1); #数组开头插入1元素
16、处理数组的一部分:
A、使用一套索引:
@array[0,$#array] = (-1,-1); #将数组的第一个元素和最后一个元素赋值为-1
@array = qw(1 2 3 4); @new_array = @array[0,3];#@new_array 元素为1、4
B、范围运算符:
@array[0..9] = ((0) x 10); #@array头10个元素被赋值为0
17、splice函数
A、splice @array, $offset; #删除数组中元素,从offset开始一直到数组结尾,如果 $offset 为负数,则从数组末尾开始数元素
B、splice @array, $offset, $length; #length 为删除的数组个数
C、splice @array, $offset, $length, REPLACEMENTS; #REPLACEMENTS可以是标量列表或者是数组表达式
18、split函数
my $record = "xin:lang:love:shen:zhen";
my @split = split /:/,$record; #以 : 分割 $record 采用//是因为它是一个正则表达式
结果为:@split = qw(xin lang love shen zhen);
19、join 函数:作用与 split 相反:
$result = join("***",@array);#将@array元素用***联合起来
20、正则表达式元素
^ 匹配行的起始
\s 匹配空白字符
\d 匹配一个数字
*? 重复0或多次,但尽少量的匹配
21、 perldoc perlre perl关于正则表达式的在线文档
perldoc perlop perl的运算符(如s///运算)的文档
perldoc perldebguts 关于perl内部的调试信息
22、 foreach $element (@array){}
注意:$element实际上是一个对数组元素的引用,对$element的改变就是对@array的改变
23、文件测试运算符
-f 是否为一个普通文件
-r 文件可读
-w 文件可写
-x 文件可执行
-d 文件为一个目录
可用 perldoc -f -r 查询,即把文件测试运算符当函数
24、redo运算符
读入一个名字列表,并将它们保存在一个数组中,如果用户输入空行,则重新输入。
for(my $index = 1; $index < 10; $index++){
print "Enter name number $index:";
my $result = <STDIN>;
chomp($result);
#如果用户输入一个空行,则再给一次机会
if($result eq ""){
redo;
}
$name_list[$index-1] = $result;
}
25、翻译运算符 tr
$hex =~ tr/!@#/123/;
如果 $hex 为Q!W@E#,则其结果为Q1W2E3.
26、unless 等价于 if not
27、__DATA__文件
这个指令告诉perl后面的内容不是脚本的一部分,而是在脚本中用于数据的一个特殊位置,它可以使用<DATA>文件句柄按一个普通文件来读。
eg:
use strict;
use warnings;
while(<DATA>){
print;
}
__DATA__
Hello, I am doing a test.
结果输出:Hello, I am doing a test.
28、<>文件定义:
* 如果在 @ARGV 中有一个参数,则<>将每个参数当做一个文件名,并按顺序读入;
* 如果 @ARGV 为空,则<>读取标准输入。
eg:
程序清单 Ques28.pl
----------------------------------
use strict;
use warnings;
my $line;
while($line = <>){
print $line;
}
----------------------------------
然后按下面指令来运行:perl Quse28.pl test1.txt test2.txt
结果:将test1.txt test2.txt两个脚本的内容输出
=====================散列、引用和复杂数据结构==================
29、散列初始化之一:
my %fix_words = (
beleive => "believe",
admimstration => "administration",
skool => "school"
);
30、遍历散列
foreach my $cur_key(sort keys %fix_words){
print "$cur_key:$fix_words{$cur_key}\n";
}
31、
================code start================
use strict;
use warnings;
my @array = qw!xin ling ye wu!;
my %my_hash;
%my_hash = map +($_ => 1),@array;
foreach (sort keys %my_hash){
print "$_ => $my_hash{$_}\n";
}
================code end==================
解析: map函数一般形式:
map expression,array;#对array中的每个元素进行expression操作
为什么 map后面出现 +(加号)?,这是告诉 map,其有两个参数,分别为$_ => 1 和 @array,否则map将误认为自己只有一个参数,即 $_ => 1.其他的自己琢磨
32、散列元素删除
delete $hash{$key};
33、散列和数组可以相互赋值
my %hash =(
sam => 45,
joe => 57,
mac => 68
);
my @array = %hash;
@array 元素为sam 45 joe 57 mac 68.注意:顺序可能不一样,因为在散列中没有定义键顺序。
34、引用(用反斜杠表示 \)
my $var = 1;
my $ref = \$var;
$$ref = 2;
print $var;#值为2
#注意:应用被引用的实际标量,需要再添加一个$,即$$ref。
#数组引用:
my @array = qw(red white blue);
my $ref = \@array;
$$ref[$#$ref];#最后一个元素
35、散列的引用
================= code start===============
use strict;
use warnings;
my $ref = {xin=>23,ling=>24,ye=>28};
print $$ref{xin};#注意两个$$
================= code end=================
36、数组的引用
my @array = qw(xin lang shen zhen);
$ref = [@array];#方括号用于创建一个数组的拷贝,并返回一个对它的引用
$$ref[1] = "test";
print "@array\n";#输出 xin lang shen zhen
print $$ref[0]."\n";#xin
print $$ref[1]."\n";#test
print $$ref[2]."\n";#shen
print $$ref[3]."\n";#zhen
###############################3
$ref = \@array;
$$ref[1] = "test";#对array的完全引用
print @array;#xin test shen zhen
my $ref = ["red","white","black"];#匿名引用的其他方法
37、散列放到数组里
my @hash_array;
$hash_array[0] = {xin=>24,ling=>25};
$hash_array[1] = {shenzhen=>perfect,guangzhou=>good};
print $hash_array[0]{xin}; #24
print $hash_array[1]{guangzhou};#good
38、打印复杂数据结构
require "dumpvar.pl"#放在程序顶部的附近,放在use行后面
dumoValue(reference);#调用,如dumpValue(\@array);
================= code start===============
use strict;
use warnings;
require "dumpvar.pl";
my @matrix = (
[qw(xin lang)],
[qw(ling xi mei)],
[qw(live in shen zhen ping zhou)]
);
dumpValue(\@matrix);
================= code end=================
result:
0 ARRAY(0x85de1c)
0 'xin'
1 'lang'
1 ARRAY(0x85de8c)
0 'ling'
1 'xi'
2 'mei'
2 ARRAY(0x1d28f34)
0 'live'
1 'in'
2 'shen'
3 'zhen'
4 'ping'
5 'zhou'
39、code test
================= code start===============
use strict;
use warnings;
require "dumpvar.pl";
my @matrix = (
[qw(xin lang work in zhong ruan guo ji)],
[qw(ling xi mei)],
[qw(live in shen zhen ping zhou)],
);
print '$#matrix:'.$#matrix."\n"; #行数
print '$#{matrix[0]}:'.$#{$matrix[0]}."\n"; #列数
print '$#{matrix[1]}:'.$#{$matrix[1]}."\n";
print '$#{matrix[2]}:'.$#{$matrix[2]}."\n";
================= code end=================
result:
$#matrix:2
$#{matrix[0]}:7
$#{matrix[1]}:2
$#{matrix[2]}:5
40、my @new_array = @old_array;#引用被复制,而数据没被复制,对@new_array的修改就是对@old_array修改
考虑使用 Storable 模块,函数 dclone 克隆一个复杂的数据结构,生成一个所有引用的拷贝。它带有一个参数,一个对即将克隆数据的引用,并返回一个对数据拷贝的引用。
================= code start===============
use strict;
use warnings;
require "dumpvar.pl";
use Storable qw(dclone);
my @old_array = qw(hua wei in shen zhen);
my $new_array_ref = dclone(\@old_array);
print "@old_array\n";
dumpValue($new_array_ref);
================= code end=================
result:
hua wei in shen zhen
0 'hua'
1 'wei'
2 'in'
3 'shen'
4 'zhen'
41、在线文档
perldoc perdata #关于perl数据结构的信息
模块:
Storable #保存和从文件读取复杂数据结构的perl模块
dumpvar.pl #一个用于倾倒变量未编进文档的模块
=====================子程序和模块==================
42、参数定义字符
$ 标量
\@ 数组(转换成引用)
\% 散列(转换成引用)
& 函数引用
@ 数组(必须为最后一个)
% 散列(必须为最后一个)
; 表示后面是可选参数
43、其他参数传递方法
sub distance($$$$){
my ($x1,$x2,$x3,$x4) = @_;
}
无参数定义的函数:如sub do_it{},这告诉perl函数带有任何类型的任何数量的参数。换句话说,绝对不进行类型检查。也没有数组到数组引用或散列到散列引用的自动转换发生,所有参数都被串联到一起,倾倒入@_.避免使用这种形式的参数传递。
44、local声明的作用:
@@@:保存变量的全局定义
@@@:允许你随意改变变量
@@@:当局部变量越出作用域时,它就恢复全局定义
my才是创建局部变量,local不是。
================= code start===============
print "$#ARGV arguments present\n";
{
local @ARGV;
my $first = shift @ARGV;
print "$#ARGV arguments present now\n";
}
print "$#ARGV arguments restored\n";
================= code end=================
等价于:
================= code start===============
print "$#ARGV arguments present\n";
my @save_argv = @ARGV;
{
my $first = shift @ARGV;
print "$#ARGV arguments present now\n";
}
@ARGV = @save_argv;
print "$#ARGV arguments restored\n";
================= code end=================
- perl 笔记
- perl笔记
- Perl笔记
- perl 笔记
- perl笔记
- perl笔记
- perl笔记
- perl笔记
- Perl笔记
- perl笔记
- Perl笔记
- Perl学习笔记
- perl学习笔记
- perl 学习笔记
- perl语言学习笔记
- perl语言入门笔记
- Perl笔记(一)
- Perl学习笔记(1)
- WhatsApp比微信好在哪里?
- jQuery验证控件jquery.validate.js使用说明+中文API(1)
- lzo安装说明
- 题目1106:数字之和
- 黑马程序员_Java基础语句学习
- perl笔记
- 【1】EXTJS4.0前序_js面向对象
- 深入理解C语言-----各数据类型大小
- Web 项目添加log4j
- 三大IM对比之一 --- 官方定阐述1
- C++ primer 5th edition:7.1.2节(关于this指针;关于const member functions)
- 博弈之Nim游戏和sg函数
- linux 的man -f/-k man 无法使用
- 代理传值