1. 标量:
双引号:可以转义,无论转义字符或变量。
$bbb = 5
print "aaa $bbb \n" == print "aaa ${bbb}" . "\n" ==>aaa5
${} 为了区别于
其他含有相同的变量。
print "aaa $bbbb \n" ==> aaa, 因为$bbbb 不存在。
print "aaa ${bbb}b \n" ==>aaa5b, 用到$bbb的值。
单引号:除 ' 和 \ 这两个符号转义外,其他都不可以转义。
print 'aaa \' \\' ==> aaa'\
print 'aaa $bbb' ==> aaa$bbb
2. 布尔值
若为数字, 0为假,其他为真。
若为字符串,空为假,其他为真, 空指 "0", "", undef
3. <STDIN>
<STDIN>每次都接受到\n的字符,即使没有输入任何内容
$line = <STDIN>
if($line eq "\n")
print " you input blank value";
4. chomp 就是去除每次输入的字符串末尾的\n字符。
chomp($line = <STDIN>)
5. undef:
初始变量时候是undef就是他什么都不是,使用define去检测是否为define,如果初始变量时候可以认为数字就把他当成0,字符串就当成"", 但绝对不是0或"",每当出现异常时候,变量内容为undef,主要判断变量是否被使用到!
6. define:
define()是为了检验undef十分为undef的值,如果是undef就返回false, 否则就true.
复数概念
7. 数组
数组名字前面加一个@,就是一个数组,读 all of the, 如:arrary[] = @arrary
从0开始计数, 访问数组元素 $arrary[0], $arrary[1] ...
数组使用非常灵活,可以自动增加和减小。增加部分是undef, 减小时候舍去后面部分。
特出索引:
$end = $#arrary; arrary[]的最后一个元素索引号。
$arrary[$#arrary] = "aaa" 给最后一个元素赋值。
$arrary[-1] arrary[]的最后一个元素。
8. 列表
用()括起来的内容就是列表,里面用逗号分开。
qw = quoted by whitespace
qw ! aaa bb ddd ccc ! 在!!里面用空格分开的列表。
列表可以赋给数组:@aa = (1 ..9), 将从1到9之间的自然数赋值给数组aa
9. pop/push
从数组尾数弹出尾元素,原数组也相应减去未元素(栈操作)。
@aa = (0 ..9);
$1 = pop(@aa) $1=9, @aa = (0 .. 8)
10.shift / unshift
队列操作,从头开始弹出
@aa = (0 .. 9)
$1 = shift(@aa) $1=0, @aa = (1 .. 9)
空数组,弹出undef
11. 内插数组时候,如果是电子邮件格式@必须进行转义。
$aa = "aaaa bbb is aaa\@com.xx ";
12. foreach:
foreach $xx(列表)
print $xx;
13. $_ 没告知
perl使用那个变量时候,就默认使用$_ (系统默认)
foreach (列表)
print $_; 没告知是那个变量,所以就使用$_
14.reverse/sort
@arr1 = sort @sort @arr2;
15.上下文:
根据上下文,就是根据表达式前后的类型来自动转换,依前一个标量类型为准。 如:
标量 = 列表 求列表内元素个数 (依照标量为准)
列表 = 标量 将后标量赋值给前一个列表, 此时列表只有一个元素了 (依照列表为准)
16. 强制转换 (求复数元素个数)
scalar @array
子程序
1. sub functionname
{
程序体;
}
调用此函数
&functionname;
&functionname(argu1, argu2...); #(argu1,argu2 ..) 被存储在默认的@_的数组里面,在函数体进行处理时候,可以通过$_[0], $_[1] .. 依次类推。
2. 如果对实参的列表按顺序依次操作,则在函数体内使用 shift @_ , 当然@_可以省略
$maximum = &max(3,5,2,4);
sub max
{
my ($xx) = shift @_ ; 或 my $xx = shift; #实参列表的第一个元素,暂时看为最大
foreach(@_)
{
if($_ >$xx)
{
$xx = $_;
}
}
$xx; # return $xx, 省略return
}
3. my 局部变量:
my ($aa) = @_ ; 参数列表第一个元素付给$aa, 相当于 ($aa) = @_ , 列表操作。
my $aa = @_ ; 参数列表的元素个数付给$aa, 相当于 $aa = @_ , 标量操作。
my($aa, $bb); $aa, $bb 都被声明;
my $aa, $bb; 错误, $bb并没声明。
4. 重载系统的函数时候,必须加上&
sub chomp
{ print "aaa \n"}
&chomp; 一定加&, 因他同系统chomp同名。
输入/输出 < >
1. while(defined($line = <STDIN>)) == while(defined(<STDIN>))
{ print "$line is what i saw"; } { print "$_ is what i saw!"; }
2. <> 行输入操作符号:
aa.pl
while(define(<>)) 或 while(<>)
{
chomp;
print "line : $_ ";
}
./aa.pl file1 #此时他就是读取file1的每一行,相当于将file1打印出来。
3. @ARG 命令参数数组,存储./aa.pl file1, file2 ... 里面的(file1, file2 ...)
@ARG = qw ! aa bb cc !
while(<>)
{
chomp;
print " $_ is saw";
}
4. 文件读写
open CON, "file1"; 打开文件
open CON, "<file1"; 打开文件,读 (默认操作,效果同上)
open CON, ">file1"; 写文件,覆盖
open CON, ">>file1";写文件,追加
常用操作:
if(! open CON, ">>log")
die "can't open log $!"; #$!存储异常信息。
5. close CON;
哈希
1. 值得访问:
$hash{$key}
2. 这个哈希表 %
my %hash = (
"aa" => "ken",
"bb" => "cath");
$name = $hash{"aa"}; #$name = "ken";
3. hash操作
keys 键的列表
my @k = keys %hash #所有键存入数组k
my @v = values %hash #所有值存入数组v
each 操作返回每对hash元素
while( ($k,$v) = each %hash)
print $k . "=>" . $v ;
exists: 检测hash里面是否有某个键
if(exists $hash{"lik"})
print "lik has one ";
delete 删除hash元素对
delete %hash{$one};
4. %ENV
操作系统环境变量
如察看path
print $ENV{PATH}
正则表达式
1. 任务:查看一个字符串,然后决定这个字符串是否有符号模板匹配的字符.
如:
grep 'aa.*bb' filename*.txt
在filename1.txt, filename2.txt ...里面找到所有包含aa然后是 随意字符 然后是bb的行。
2. 模式 m// :m可以省略
如果对$_(默认的标量)匹配,可以用 if(/xxx/), 不用if ($_ =~ /xxx/)
3. 元字符 “.”(一个字符的通配符,不能为空字符)
表示任何单字符的通配符(除“\n"外)。
4. * 号表示,前一个字符或()中内容的0次或多次
ab* 可以使ab, abb, abbbb
abcd(ef)*cc 可以是abcdefcc, abcdefefcc, abcdefefefcc
.* 表示任意个字符,常用来表示中间有不定的字符个数
+ 号表示, 前一个字符或内容一次或一次以上
abcd+cc 可以是abcddcc,abcddddcc, 不能是abcdcc
? 号表示前一个字符或内容可有可无。
abcd?cc 要么abcdcc要么abccc
5. 模式分组:用()将模式内分成n组,从1开始续增
/(.)\1/ 匹配 bb, cc 等
/y(.)(.)\2\1/ 匹配 yabba, yxyyx等
6. | 择一符号
/aa( |\t)+bb/ aa后有空格或tab一个或多个,然后是 bb: "aa bb"
7. 转义:
\d :[0-9] \D = [^0-9] 非数字
\w: [A-Za-z0-9] \W = [^A-Za-z0-9] 非常规字符
\t tab
\r 回车
\s 空格, \s* 0个或以上空白 \s+ 至少一个空格 \S = [^ ] 非空格
8. 若不是默认匹配格式需要加m
m!aa.*bb! 用!来标示模板,m不可省
m/aa.*bb/i i:大小写无关
m/aa.*bb/s s:匹配任意字符,包括\n (对"."匹配模式很有效,就是对多行都可以匹配)
m/aa. * bb /x x:去掉模式里面的空格
9. 锚定
^ 开头
$ 结尾
\b 单词边界 /\bken/ 可以是aa kenddd cc /ken\b/ : aa ccken dd /\bken\b/ : aa ken cc
10.比较奇怪的操作
将一段字符串按照匹配分隔成三段,并分别存在默认的标量里面.
$& 表示匹配的字符串
$` 表示匹配字符串前面的字符串
$' 表示匹配字符串后面的字符串
"hello there, neighbor" =~ /\s(\w+),/
$& = "there,";
$` = "hello "; 这里hello后面有空格。
$' = " neighbor"; 单词前面也有空格。
正则表达式文本操作
1. s/a/b/: 把a换成b
s/a(.*)b/$1's/ 结果可能为:abb'sb 用$1,$2...代表()中内容。
s///g: g表示全部更换
\U:将其后面的所有都大写
$_ = "i can say abc";
s/(abc|ABC)/\U$1/gi; 结果: $_ = "i can say ABC";
\L:将其后所有字符都小写
\u 和\l 只影响到其后的第一个字符,而不是其后所有字符
2. split:将字符串按照separator分隔为数组,很有用!!
@fields = split /separator/, string;
@arrary = split /:/, "a:b:c:d"; @arrary = (a,b,c,d);
my @field = split 等价于 split /\s+/, $_;
3. join: 将数组按照指定字符串相粘结成一个字符串
my $x = join ":", 2,4,5,7; $x = "2:4:5:7";