1. 数字
(1).所有整数和浮点数都按double类型存储。例如0, -40, 0377, 0xFF,1.25, 255.0, -6.5e24 (2).可以插入下划线吧若干位数分开61_298_040_283_768(应该用逗号来分,但是逗号在perl中有其他意义)
(3).运算:除法总是按浮点数运算.例如10/3=3.33333...
支持整数取模计算,例如10%3=1
乘幂操作用双星号表示,比如2**3=8
(4).用Math::Complex模块支持复数
(5).同样支持+=等操作
2. 字符串
(1). 最长没有限制。可以是任意字符(无论是否为可见字符)
(2). ''和“”规则和bash相同,比如'Don\'t do that'中‘需要用反斜线转为字面量, 'hello\n'中全部为字面量。如果没有空格等任何特殊字符,字符串也可以不用‘’和“”
双引号中的几个反斜线转义
\l 下个字符转为小写
\L 直到\E为止所有字符为小写
\u 下个字符转为大写
\U 直到\E为止所有字符为大写
\Q 直到\E为止所有字符加上反斜线
\E 结束\L.\U,\Q
\cC 控制字符,相当与Ctrl键
\e Esc键
(3). .操作符 字符串连结
#!/usr/bin/perl -w
$var1="Hello"."World";
$var2="Hello".' '."World";
$var3='hello world'."\n";
print $var1."\n";
print $var2.$var3;
print $var1, $var2.”\n”
同样有类似的.=,但是没有x=
(4) . x操作符(小写字母x)字符串重复
5 x 4 结果是“5555” 5*4=20. 涉及字符串操作符的数字操作数将转换为字符串
3. 使用内建警告
SHELL>perl -w my_program
or
#!/usr/bin/perl -w
or
#!/usr/bin/perl
using warnings;
4. 双引号字符串里的变量内插
$meal=”steak”
$barney=”Fred ate a $meal”
same as
$barney='Fred ate a '.$meal
所以,双引号里输出$字面量需要用\来escape
5. 运算符的优先级(和C语言相同) 由高到低
三目运算符?:
等号运算符 = += .=
逻辑运算符 not > and > or xor
6.比较运算符
数字 字符串
== eq
!= ne
< lt
> gt
<= le
>= ge
例如
35==35.0 #true
‘35’eq‘35.0’ #false
‘fred’ lt 'free' #true
if (1==2 or not 1==0 and 1==1){
print 'true',"\n";
} #true
7. 获得行输入
$line=<STDIN>
chomp运算符:移除字符串末尾的换行符。
$text=<STDIN>;
$chomp($text); #或者chomp $text
8. 所有未初始化的变量 undef值。检测是否初始化defined函数
例如
$line=<STDIN>;
if(defined($line)){
print “true”;
$line=undef; #重新设为undef
}
9. 数组
(1).数组从0开始,即可以为$arr[0]赋值。赋的值可以是任意类型。如果对超过数组尾端的元素进行赋值,数组将会自动增大。
例如
$arr[0]=0
$arr[1]=1
$arr[99]="the end"
则[2]-[98]是undef
(2).如果下标超过数组的尾端,将会是undef
(3).最后一个元素的索引值为$#arr
#!/usr/bin/perl -w
$arr[0]=0;
$arr[1]=11;
$arr[2]=22;
$arr[9]=99;
print $#arr, $arr[$#arr];
(4).负数下标,-1代表倒数第一个,-2第二个。。
10. 列表,圆括号中的一系列值。数组的另一种表现。
(1,2,3)
(1,2,3,) #末尾的,将被忽略
(“fred”,1,2)
() #空列表
(1..10) #100个整数构成的列表
(1.5..10.5) #小数部分会被模掉。内容同上
(10..1) #结果会是空
($start..$end) #生成从数字$start到$end的列表
(1).qw quoted word生成加上引号的单词列表
qw(banana, apple, orange, grape, mango)
则生成”banana”, “apple”, “orange”, “grape”, “mango”
qw的定界符(delimiter):不一定圆括号,还可以是! / # () {} [] <>,要使用结束定界符的字面量需要转义。
(2).赋值
($fred, $barney, $dino) = (“stone”,”rubble”, undef)
($fred, $barney)=($barney, $fred) #实现变量的互换
如果赋值不够列表中所有的变量,后面的变量则为undef
(3).用列表构建数组
(fruit[1],fruit[2],fruit[3],fruit[4],fruit[5])=qw(banana, apple, orange, grape, mango)
引用整个数组的方法:在数组名前加上@字符
例如
@fruit=qw(banana, apple, orange, grape, mango)
@num=1..1e5 #100,000个数
@morenum=(@num, 0, @num) #200,001个数
@othernumarr=@num #将一个数组中的列表复制到另一个数组
(4).push pop shift unshift
push(@arr, 0) #push和pop从数组的末尾取数
push @arr, 1..10;
push @arr, @otherarr;
pop @arr 仅弹出最后一个
unshift @arr, @otherarr; #unshift和shift从数组的开头取数
(5).将数组内插到字符串中
print “we have @fruit”; #每个元素之间用空格隔开。首位不会增添额外空格。
注意如果双引号字符串中需要用@字面量,应用\@
例如“someone@gmail.com”就是错误的,会内插@gmail数组
(6).foreach控制结构
$arr[0]=0; $arr[1]=11;
$arr[2]=22;
$arr[9]="the end";
print "@arr";
foreach $one (@arr){
#对于数组中每一个变量$one$one.="\n";
} #这样 每一个变量都变成一行
print "@arr";
或者直接使用“老地方”变量$_
foreach (@arr){
$_.="\n";
}
(7). reverse @arr#反序
sort @arr #按ASCII编码排序
11.标量上下文与列表上下文
(1).上下文是表达式所在的位置。perl在解析表达式的时候,需要出现的位置希望目标是一个标量或列表。即不同上下文环境中,变量目标的值可能不同。
例如
@fruit=qw(banana, apple, orange, grape, mango);
@sorted=sort @fruit; #列表上下文,@fruit在这里代表一个列表
$num=42+@fruit; #标量上下文,@fruit在这里代表标量——列表的长度5
@list=@fruit;
$n=@fruit;
print @sorted, "\n" ,$num, "\n", @list, "\n", $n;
(2).sort在标量上下文中将返回undef 例如$num=sort @arr
(3).reverse在列表上下文将是所有元素的反置,在列表上下文中将是所有元素的字符串连结在一起然后按字符串反置。
例如
@backwardByElem=reverse qw/first second third/;
$backwardByChar=reverse qw/first second third/;
(4).几个上下文例子
($first, $second) = something #列表上下文
($first) = something #列表上下文
if/while(something) #列表上下文
$fruit[@fruit]=@fruit; #添加一个元素到数组末尾。数组是从0开始的。添加之后最后一个元素下标$#fruit是5
print "the \@fruit is ", @fruit, "\n", "the last one is ", $#fruit, " ", $fruit[$#fruit],"\n";
push @fred,@fruit #列表上下文,@fruit是列表
sort/reverse @fruit #列表上下文
print @fruit #列表上下文
@fred=6*7 #fred得到一个仅有一个元素42的列表
@wilma=undef #得到一个列表,其中只有一个元素是undef。正确清楚数组的方法是@betty=();
(5).scalar函数 强制转换为标量上下文
print “I have”, scalar @fruit, “ fruits!\n”;
(6).@lines=<STDIN> 列表上下文中的读取标准输入
会返回所有的行,直到文件结束(Ctrl+D)为止
@lines=<STDIN>;
print "@lines"; #每一个元素都有一个换行符
chomp @lines; #删除所有换行符
print "@lines";
或者chomp(@lines=<STDIN>);
例1:写一个程序,读入一些字符串(每行一个)直到文件结尾为止。然后相反顺序输出这个列表。
#!/usr/bin/perl
@lines=<STDIN>;
@lines=reverse @lines;
#chomp @lines;
print @lines;
例2:写一个程序,读入一些数字(每行一个),直到文件末尾(EOF)。然后,根据每个数字,输出如下名单中相应的水果名。比如1,2,4,2将输出 banana apple grape
@fruit=qw(banana, apple, orange, grape, mango)
#!/usr/bin/perl -w
@fruit=qw(banana, apple, orange, grape, mango);
chomp(@lines=<STDIN>);
foreach (@lines){
print $fruit[$_ - 1];
}
Textbook:Learning Perl