当前位置:   article > 正文

perl使用学习(全程更新)_perl怎么用

perl怎么用

perl

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哈希

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/738351
推荐阅读
相关标签
  

闽ICP备14008679号