赞
踩
Practical Extraction and Reporting Language
我安装的是strawberry perl 还有一种在window下常用的是activestateperl,相对于activestateperl,strawberry perl多了一些CPAN的模块。
编辑器使用的是textpad8。
浮点数小数、整数等 $a = 1.25;
对于perl语言,是严格区分大小写的,在perl语言中,不能使用逗号作为一个数字的分隔符,而应该使用的是下划线作为分隔符”_“,比如”61_789_852“。
默认进制为10进制,数字最前如果带的是0,那么为八进制,比如$a=0377,输出的数就是255(十进制),如果数字最前带的是0x,那么为十六进制,比如$a=0x56,输出的数就是86(十进制),如果数字最前带的是0b,那么为二进制,比如$a=0b101110011,那么输出的数就是371,”_“也可以用来分割多进制数。
**乘方
%取模 取余数 只针对整数
单引号、双引号皆可,但是也有一定的区别,比如print中对于双引号中的字符串会特殊识别转义字符。
转义字符:在双引号中会特殊识别,但是在单引号中却不会被识别。
\a 响铃
\b 退格
\f 换页
\n 换行
\r 回车
\t 水平制表
\v 垂直制表
\\ 反斜杠
\? 问号字符
\‘ 单引号字符
\“ 双引号字符
\0 空字符
\ddd 任意字符 三位八进制
\xhh 任意字符 二位十六进制
. 连接符号 连接双引号 单引号 变量都可以
x多次重复出现 比如:print "hello\n" x 20; 输出20次hello\n
字符串中的变量内插(变量替换)——双引号内插,使用双引号中直接使用print "okokokok:$a"; $a会直接被$a所替代。
print "okokokok:$a"; 等效于 print "okokokok:${a}";
数字和字符串的自动转换
标量变量:可以使用下划线和字母开头,但是不可以使用数字开头。
$_hello = 99;
双目运算符:
$fred +=5; #自加5
$fred *=5; #自乘5
$fed .="perl"#自连接一个字符串
##
print "\n the answer is".6*7."\n"; #连接 连接 点
print "\n the answer is",6*7,"\n"; #列表,逗号
##
比较操作符:
== != < > >= <= (用来比较数值)
eq ne lt gt ge le (用来比较字符串)(对于字符串的比较)
在perl中,大括号必须写,对于if else那么只有一句也必须写大括号。
获取用户输入
$name = <STDIN>; #表示从键盘输入
chomp操作符
chomp()去掉()最后一个\n,()可以省略,如果没有则无操作,并且如果有去掉数据,那么返回1.一般用于去掉获取用户输入的回车,(在STDIN输入的时候最后会敲击一下回车来完成输入,所以会采用chomp去掉回车符号)。
chomp($name);
while控制结构
while()
{
}(大括号必须存在)
undef值
print $x + 1; #没有对$x进行定义,但是并不会产生问题,未定义会默认为空(或者是零)来进行计算。也可以对之前定义过的数据进行定义,定义成空即$k=undef;即使把k定义成空。
defined函数
用来检查一个变量是否是未定义,如果已经定义那么返回1,如果未定义,那么返回0。即defined($a)
布尔值
1.如果值为数字,0为假;所有其他数字都为真。
2.如果值为字符串,空字符串为假;所有其他字符串都为真。
3.如果不是数字也不是字符串,就先转换成数字或字符串再判断。例如:undef为假
!注意:对于数字0,为假,但是对于'0'字符串也为假,但是对于‘00’为真,对于‘’空字符串为假。
关系操作符
结果为真时返回1,结果为假时返回空字符串(注意:不是0)。
数字 字符串
> gt(Greater than)
>= ge(Greater than or equal to)
< lt(Less than)
<= le(Less than or equal to)
== eq(equal)
!= ne(not equal)
<=> cmp 飞船操作符
注意:飞船操作符(<=>) 对两个数进行比较,如果第一个数大于第二个数返回1,如果小于返回-1,如果相等,返回0。
访问数组中的元素
数组里的元素可以是不同类型的,可以在一个数组中同时放标量,字符串等。
对数组整体操作使用@,对数组里的元素进行操作的时候用$。
@fr =("abc","qwe","ert"); #直接定义一个整体数组
print $fr[0]; #输出的是abc
或者
$ferd[0]=1;
$ferd[1]=2;
$ferd[2]=3;
print“@fred”;
分割数组元素:输出一个整体数组,并且使用内插输出可以自动分割开这些数据,如果不适用内插使用print @fres 会导致输出的每一个数之间没有间隔
如果不想使用内插默认的空格做分割,可以在print “@fred”;之前增加一句 $" =",";来使用逗号(,)做分割,当然也可以把逗号用其他的符号来进行替代。
print@fre; #不出现内插间隔 即123
print "@fre" #出现内插1 2 3;
特殊的数组索引值
查询数组中的元素最后一个的下标即 $#数组名
那么数组中元素的个数则就是 $#数组名 + 1
还有一种查询数组最后一个元素的方法 那么就是用 $数组名[-1]来表示,代表最后一个,如果是$数组名[-2]那么就代表了倒数第二个。
列表直接量
@a = (1..20); #范围操作符,只能够从小到大,赋值123456789....20,如果范围操作符使用小数开头,那么小数部分会被舍弃掉。
qw简写
@a = ("abc","wer","yui"); 等效于 @a=qw(abc wer yui); #相当于qw代替了所有的符号。同时还等效于等效于 @a=qw!abc wer yui!;还等效于 @a=qw{abc wer yui};还等效于 @a=qw<abc wer yui>;等,只要前后符号一致就可以。
列表的赋值
($a,$b,$c)= ("wert","dfgd",undef);
($a[0],$a[1],$a[2])= qw(wert dfgd undef);
字符串中的数组内插
@rocks = qw/behd neje bebe/; #三个元素
@tiny=(); #空
@gint=1...10; #10个元素
$dio = "fgh"; #1个元素
@studff =(@gint,undef,@tiny,@rocks,"crush kie",$dio); #10+1+0+3+1+1=16个元素
foreach控制结构
#######################
@rocks =qw(a b c d);
foreach $rock(@rocks) #将括号里的数组挨个给了$rock,此括号不能省略
{
print $rock."\n";
}
print"\n";
foreach (1..15) #将括号里的数组挨个给了默认变量,用$_表示默认
{
print"$_"."\n";
}
#######################
常用操作
pop
pop删除数组中的最后一个元素,但并不是消失。
@rocks=qw(a b c d);
$reg=pop(@rocks); #删除@rocks中最后一个元素,放入$reg中,此括号可以省略
print"@rocks"."\n"; #a b c
print"$reg\n"; #d
push
push在数组最后增加数据
push(@rocks,d); #在@rocks最后增加一个元素
print "@rocks";
push @rocks,1..5;$在@rocks最后增加一个数组,可以不带括号
print "@rocks";
shift
shift在数组最前面删除
$a=shift(@rocks); #删除数组最前面的一个元素
print "@rocks";
print "$a"; #删除的元素留在了$a中
unshift
unshift在数组的最前面增加元素
unshift(@rocks,1..10); #同push,只是增加元素的位置不一样
reverse
反转数组顺序
@a=reverse @b;#反转@b中的元素的顺序给了@a,但是@b中并没有改变。
sort
排序函数,按照从小到大的顺序进行Ascall码排序,把数变成了字符串,进行排序。如果想对数值大小进行排序,则要这样用:@out=sort{$a<=>$b}@numbers; (钻石操作符,之后会学到)
如果想从大到小,则只需要使用reverse sort @rocks
可以多个操作符直接叠加!
标量上下文和列表上下文
@people = qw(fred barney bettry);
@sorted = sort @people; #列表上下文 对列表进行排序 得到的是一个列表 所以是一个标量上下文
$number = 42 + @people; #标量上下文,将@people转换成3 有三个元素 得到的是一个标量 所以是标量上下文
在perl中允许同时使用@people和$people 一个代表的列表 一个代表的是标量
@fred = 6 * 7; #这是一个列表上下文,将一个标量给了列表,得到只含有一个元素的列表上下文
在标量上下文中使用产生列表的表达式
@fred = 6 * 7; #这是一个列表上下文,将一个标量给了列表,得到只含有一个元素的列表上下文
在列表上下文中使用产生标量的表达式
$number = 42 + @people; #标量上下文,将@people转换成3 有三个元素 得到的是一个标量 所以标量上下文
强制指定标量上下文
scalar @rocks #可以直接查询列表中的元素个数 转换为标量上下文
列表上下文中的<STDIN>
$line = <STDIN>; #只能输入一行
@line = <STDIN>; #可以输入多行 当想停止输入 则需要点击ctrl+z
chomp(@line = <STDIN>) #会去掉每一行的\n
定义子程序
sub 函数名
{
}
调用子程序
&函数名; #调用
返回值
perl中所有子程序(函数)全部都有返回值,一般都是返回最后计算的那个数(或者是最后执行的那一行,比如在选择语句中),作为函数的返回值。
参数
sub max
{
if($_[0]>$_[1]){
$_[0];
}else{
$_[1];
}
}
子程序的私有变量
sub max
{
my($m,$n) ; #私有变量 局部变量
($m,$n)=@_; #默认数组给了局部变量
}
# 最后的语句的;可以不写
长度可变的参数列表
sub max{ #@_ 长度个数可变
my($max_so_far) = shift @_;
foreach(@_){
if($_>$max_so_far){
$max_so_far = $_;
}}
$max_so_far; #函数返回值}
关于词法(my)变量
1.可以放在子函数里也可以不用在子函数里,也可以用在其他地方,只要在语句块中使用就可以,比如放到foreach语句块里。
2.
sub demo{
my($num1) = @_; #加括号列表上下文,只输出列表的第一个数
my $num2 = @_; #不加括号标量上下文 输出列表的数个数
print "$num1\n";
print "$num2\n";
}
&demo(7,5,10);
3.
my $a; #声明一个局部变量
my $a,$b; #这样只声明了$a 而第二个并没有声明,如果想要同时声明两个,要不然分开声明,要不然加上括号。
use strict 编译命令
位置:所有地方的最前面,代码开头,会严格限制语法。
use strict;
要求所有变量必须使用my进行声明,即使在全局变量中也要用(推荐!)。
return操作符
返回某个数值,并且终止循环。
my @names = qw(a s d f x e g q t y u i);
$a = &find("e",@names);
print "$a\n";
sub find{ #可以在使用之前定义,也可以在使用之后定义
my($what,@array) = @_;
foreach(0..$#array){//$#代表最后一个下标
if($what eq $array[$_]){
return $_; #返回排在第几个
}
}
-1 #如果没找到,那么返回-1
}
省略“与号”
最好不要省略(特指调用函数的&),如果省略,一旦自己写的和内置函数重名,那么就回去调用内置函数,所以最好带上。
非标量返回值
函数返回值不一定是一个数值标量,也可以是其他。
my ($n,$m);
$n = 5;
$m = 16;
sub get_list{
if($_[0]<$_[1]){
return $_[0]..$_[1];
}
else{
reverse $_[0]..$_[1];
}}
my(@h)=&get_list($n,$m);
print"@h\n";
持久性私有变量 //相当于静态变量
首先要在最前加上use 5.010; #使用新版本
如果在函数中使用my,就会是局部变量。如果想要变成持久性私有变量,那么使用state替代my进行定义,这样此变量就会在函数结束时继续保存其本来拥有的值,并不会重新开始。
输入
读取标准输入
多循环输入
while(defined($line=<STDIN>))
ctrl+z结束工作
while和foreach区别 对于while是每次读取输入一次就进行操作一次 而对于foreach则是是将所有输入都放到列表上下文结束之后再一块进行操作
行输入操作符 <STDIN>
同上
钻石操作符 <>
<>钻石操作符和STDIN相同用法
调用参数@ARGV
while(<>)
{
chomp;
print "$_\n\n";
}
perl test.pl m.txt n.txt k.txt#调用这些文档 循环读取这些文件
perl test.pl m.txt n.txt - k.txt #调用这些文档 m n 然后到- 等待键盘输入 然后再 调用k.txt
但是如果直接在程序前加一行
@ARGV=qw#m.txt n.txt - k.txt#;#出现这种情况 在命令和ARGV冲突的情况下 按照程序中的ARGV来
输出
输出到标准输出: print 和 say
say输出之后自带\n 使用say必须在最前边表明use 5.010
print <>; 直接输出输入的数据 print sort <>;将输入的数据排序并且输出、
print ("hello \n");
print "hello \n"; 这两者并没有区别
print (2+3);
print 2+3; 这两者也没有区别
print (2+3)*4; 但是这个式子的结果却是5并不是20,因为这个式子想当于先2+3,结果再乘5,但是输出的是2+3的结果,然后再乘5,如果想要得到输出20的话,那么就得 print ((2+3)*4);这样才会得到20
使用printf格式化输出 %s %d %f %g
基本和c一样。
$use="m666";
printf "%s abv\n",$use;
printf可以指定宽度,print却不可以。
printf "%6d\n",42 #宽度为6位
printf "%6.3f\n",42 #总宽度为6位,小数点后还有3位
数组和printf
my @items =qw(qwed hffjd vcuhuh);
printf "%10s\n%10s\n%10s\n",@items;
printf "%10s\n"x@items,@items; #这两者都可以 第二个里的 前者是标量上下文 后者是列表上下文
文件句柄
打开文件句柄
使用文件句柄
关闭文件句柄
open kkk,"<","test.txt"; #打开文件句柄 逗号注意
while(<kkk>) #使用文件句柄
{
print "I saw $_!\n";
}
close kkk; #关闭文件句柄
#######################################
open kkk,">","tet.txt"; #创建文件句柄 并且>代表将kkk写入到tet中
print kkk "hello\n"; #写入操作
close kkk; #关闭文件句柄
#######################################
open kkk,">>","tet.txt"; #创建文件句柄 并且>代表将kkk追加到tet中
print kkk "hello\n"; #写入操作
close kkk; #关闭文件句柄
#######################################
my $success = open kkk,"<","tet.txt"; #检查是否打开成功 如果成功那么为1
或者
if(! open kkk,"<","tt.txt")
{
die "Cannot open file:$!"; #die 停止执行
} #这样还可以显示出因为什么而出错,可以改成中文
六个标准文件句柄
STDIN STDOUT STDERR DATA ARGV ARGVOUT
哈希
什么是哈希
访问哈希元素
#哈希作为一种数据结构 保存数据的结构
# key value
# 键 值
$score{"刘备"} = 99; #名字1可以作为数组名字
$score{"关羽"} = 61;
$score{"张飞"} = 43;
#key value 可以是各种类型
print $score{"关羽"};
访问整个哈希元素
哈希赋值
$score{"刘备"} = 99; #名字1可以作为数组名字
$score{"关羽"} = 61;
$score{"张飞"} = 43;
%score = ("刘备",99,"关羽",61,"张飞",43); #这样也是哈希赋值的一种方式
%score = ("刘备"=>99,"关羽"=>61,"张飞"=>43);#也是一种赋值方式 =>称为胖箭头
@arry=%score;
print "@arry\n";
print "%score";#没有办法被双引号标注
print %score;
哈希可以直接给哈希赋值 %newscore=%score;
胖箭头
哈希函数
keys
my %hash =("a"=>1,"b"=>2,"c"=>3);
my @k = keys %hash;#keys拿取hash的键 并且放入列表 但是键值是随机放入的 不是按照顺序放的
print "@k\n";
values
my %hash =("a"=>1,"b"=>2,"c"=>3);
my @k = values %hash; #values拿取hash的值 即value
print "@k\n";
each
exists
delete
#ENV哈希
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。