Perl基础总结

Perl基础总结


1 perl的自动检测
1.1 命令行的检测方法
可在程序的第一行的命令行参数中加入-w参数,如下:
#!/usr/local/bin/perl -w
1.2 perl程序内部的检测方法
在程序中加入如下的行:
use strict;

use diagnostics;
2 变量
2.1 标量
一般的使用方法:$scalar。
2.2 数组
一般的使用方法:@array。数组下标从0开始记数。
数组中的元素的类型可以不相同。
数组中元素的使用:$array[1]。
数组的引用(可看作C语言中的指针):$arrayref = /@array;
使用:$$arrayref[1]或@$arrayref。
2.3 哈希
一般的使用方法:%hash。
哈希表中元素的使用:$hash{index}。
哈希的引用(可看作C语言中的指针):$hashref = /%hash;
使用:$$hashref{index}或%$hashref。
哈希表中内容的输出方法:
use Data::Dumper;
print Dumper(/%hash);
2.4 变量的类型的确定
可使用函数ref。如:
$arrayref = /@array;
print ref($arrayref);
2.5 变量的作用域
在perl中变量无须声明,在任何时间、任何地点我们可以随意地引入变量。但是如果我们没有在变量前加任何限定的话,那么不论在哪儿引入的变量都将是全局变量。
为了保持程序的对立性及完整性,perl提供了如下两种方式实现对变量的作用域的控制。
2.5.1 my作用域
my作用域主要用来声明局部变量。
my声明的变量将作用于声明的层次及同一层次上定义的子程序。
2.5.2 local作用域
local作用域主要用于对全局变量的动态作用。它只影响声明的层次以及以内的层次,表明该全局变量在local作用域声明的层次上进行的值修改只在该层次及以内的层次上有效,而对外层上该全局变量的值不产生影响。
2.6 内部变量
2.6.1 <STDIN>
内部文件句柄,接收用户从键盘的输入。
2.6.2 STDOUT、STDERR
内部文件句柄,STDOUT为标准输出,STDERR为错误输出。
2.6.3 <ARGV>
命令行参数文件句柄。
2.6.4 @ARGV
将命令行参数保存在数组中。
2.6.5 @INC
将perl搜索库的目录次序保存在数组中。
2.6.6 %INC
用哈希结构给出use库的来源(目录)。
2.6.7 %SIG
设置perl程序中对信号的处理程序。如:
$SIG{INT} = ‘IGNORE’;

$SIG{INT} = /&hit_control_c;
2.6.8 $_
充当缺省变量。当明显需要一个变量而在语句中未指明时,$_将成为该变量。
一个函数没有参数且我们知道它必须有一个时。
print;
die if (-f);
看到象正则表达式的代码,但没有包含=~时。
if (m”whatever) { &do_something; }
在foreach循环中使用。
foreach (@args) { $_…}
2.6.9 $”
决定将数组转换为字符串时,perl自动在每个元素之间所加入的信息。如:
$” = “|”;
print “@arrayName”;
2.6.10 $,
决定将数组转换为字符串输出时,perl自动在每个元素之间所加入的信息,但它只对下面列出的情况下起作用。如:
$, = “|”;
print @arrayName;
2.6.11 $/
决定在print输出时每一行的末尾所增加的信息。缺省设置为空。
2.6.12 $/
决定从文件句柄读取信息时的数据行的分隔符。缺省设置为’/n’。
2.6.13 $1、$2、$3、…
保存正则表达式中由小括号所指定的匹配部分。
2.6.14 $`、$&、$’
正则表达式匹配时所匹配前面的文本、实际匹配的文本、匹配之后的文本。
需确认多个匹配时的情况
2.6.15 $0
程序名。
2.6.16 $$
当前进程的ID。
2.6.17 $?
给出任一系统调用或在反记号中给出的命令的最后错误状态。
3 控制结构
注意:在所有控制结构中,即使只有一个语句,也必须加上{ }。
3.1 分支结构
3.1.1 if-else-elsif
语法:
if (condition1)
{
doIfSomething();
}
elsif (condition2)
{
doElsifSomething();
}
else
{
doElseSomething();
}
3.1.2 unless
语法:
unless (condition)
{
doUnlessSomething();
}
3.2 循环结构
3.2.1 while
语法:
while (condition)
{

}
continue
{
## 每次循环结束之后都执行的语句。
}
3.2.2 for
语法:
for (pre_clause; end_condition; clause after each loop)
{

}
翻译成while语句为:
pre_clause;
while (end_condition)
{

}
continue
{
clause after each loop;
}
3.2.3 foreach
语法:
foreach 变量 (数组)
{

}
3.2.4 until
语法:
until (condition)
{

}
翻译成while语句相当于:
while (!condition) { … }
3.2.5 do … while
语法:
do { clause; } while (condition);
翻译成while语句相当于:
{clause;}
while (condition) { clause; }
3.2.5.1 do … until
语法:
do { clause; } until (condition);
翻译成while语句相当于:
{clause;}
while (!condition) { clause; }
3.3 循环结构中的控制
3.3.1 next
终止next所指定的标签处的循环的当前一次的执行,开始下一次循环,不能跳过continue块的语句。
语法:
next [标签];
3.3.2 last
执行last所指定的标签处的控制结构后面的代码块。
语法:
last [标签];
3.3.3 redo
与next基本相同,区别在于redo不会改变for/foreach的循环条件。
4 函数
4.1 函数的调用及返回值
可用如下方式返回多个值:
sub function {

if (condition1) {
return ($value1);
}

return (/@array1, $value2);
}
函数的调用方式为:
($return1, $return2) = &function();

($return1, $return2) = &function;

($return1, $return2) = function();

($return1, $return2) = function;
4.2 函数的参数传递
函数中的参数传递以数组方式进行。
函数定义如下:
sub function {
my ($parameter1, $parameter2, @parameter3)=@_;

}
函数的调用方式如下:
&function($value1, $value2, @value3);
函数参数的使用过程中我们需要注意以下一些问题:
l 数组参数的使用
如下的函数定义中可能不能达到我们所要求的效果:
sub function {
my (@array1, @array2) = @_;

}
最后我们会发现@array2为空,传入的两个数组被合并到一个数组@array1中了。
l 使用引用方式传递
尽量使用引用方式传递。对上面的函数我们可用如下方式实现:
sub function {
my ($parameter1, $parameter2) = @_;
my (@array1, @array2);
@array1 = @$parameter1;
@array2 = @$parameter2;

}
函数的调用方式为:
&function(/@array1, /@array2);
4.3 动态调用函数
在perl中使用eval来实现函数的动态调用。如:
if (condition1) {
$function = “function1 $parameter1”;
} else {
$function = “otherwise”;
}
eval $function;

sub function1 {
my ($parameter1) = @_;

}
sub otherwise {

}
在eval使用过程中我们应注意以下问题:
l eval中执行的程序完全符合perl的语法;
l eval执行的程序中出错时不会终止主程序的运行;
l eval能使用主程序中的全部变量。
5 语句的简洁化
我们可以将if语句:
if (condition1) {
if (condition2) {
clause;
}
}
进行简洁化:
condition1 && condition2 && clause;
我们可以将unless语句:
unless (condition1) {
unless (condition2) {
clause;
}
}
进行简洁化:
condition1 || condition2 || clause;
6 正则表达式
我们用正则表达式可以完成字符串中的模式匹配和替换,只能用于标量。
6.1 分界符
正则表达式可使用/和”作为分界符。具体采用何种分界符可根据匹配模式而定。若匹配模式中出现”,我们可用/作为分界符;若匹配模式中出现/,我们可用”作为分界符。
6.2 通配符
6.2.1 正声明
/D 非数字
/d 数字
/W 非单词
/w 单词
/S 非空格
/s 空格
‘.’ 换行符以外的任意字符
6.2.2 负声明(只是一个位置,不匹配具体字符)
^ 字符串开头
$ 字符串结尾
/b 单词边界
/B 非单词边界
6.3 多重匹配运算符
6.3.1 贪婪
* 匹配0次,1次或多次
+ 匹配1次或多次
? 匹配0次或1次
{X} 匹配刚好X次
{X,} 匹配X次或更多次
{X,Y} 匹配X到Y次
6.3.2 非贪婪
*? 匹配0次,1次或多次,但匹配可能的最少次数
+? 匹配1次或多次,但匹配可能的最少次数
?? 匹配0次或1次
{X}? 匹配刚好X次
{X,}? 匹配X次或更多次,但匹配可能的最少次数
{X,Y}? 匹配X到Y次,但匹配可能的最少次数
6.4 特殊使用方法
6.5 反向引用
perl支持通过反向引用来从匹配串中取出自己感兴趣的内容。对于多个的反向引用,系统按从左到右的顺序保存在系统变量$1、$2、…中。如:
$string = “abcd my content efgh next content ijkl”;
$string =~ /(my c.*ent).*(next c.*ent)/
则第一个括号中所匹配的内容为my content,保存在系统变量$1中;第二个括号中所匹配的内容为next content,保存在系统变量$2中。
l 嵌套的反向引用
对于嵌套的反向引用,系统对内容的保存顺序可能与具体的perl解释程序有关,我所测试得出的结论为先从外到内,相同级别的则从左到右。
6.6 修饰符
x 可读的正则表达式形式,允许表达式写成多行
i 大小写不敏感的正则表达式
s 将被匹配字符串看作单个字符串
m 将被匹配字符串看作多个字符串
o 只编译正则表达式一次

g 只对替换方式有用,对被匹配字符串中所有能匹配的串进行替换

你可能感兴趣的:(正则表达式,String,function,perl,each,Diagnostics)