美文网首页
perl的基础语法

perl的基础语法

作者: wo_monic | 来源:发表于2022-09-27 20:20 被阅读0次
#/usr/bin/perl
print "test\n";

#perl 基础语法 这是单行注释
#perl代码的行尾需要有分号,不然会报错
=pod 开始区块注释
多行注释
这里的代码不会被执行
=cut

perl里的空格和换行会原样输出,不用担心缩进。

和shell一样单引号内的字符不能转义,双引号可以。

print "这里会自动转义,输出换行符\n";
print '这里的字符不会被转义\n\t';
print "\n"; #强制换行

Here语法(标记语法)

#标记一段文字,存入一个变量中
$Here1 = <<"EOF";
Here的语法
这里的内容都会保存到变量name里。
这个地方的东西会自动转义单双引号
只需要开始和结束的时候的字符相同
前面的EOF的后面一定要有分号,后面的EOF一定不能有分号
字符不一定是EOF,任意字符都可以。
EOF
print "$Here1\n";

数据类型(比较灵活,$字符串就是变量名,不区分整形和浮点型)

$name="张三abi124"; #字符串和数字
$age=18; #数字类型

#数组格式1,下标是从0开始的,使用的是@字符串作为数组的名称
@namelist=("zhangsan","Lisi","Maliu");
print "$namelist[2]\n";

#数组格式2,下标是从0开始的,使用的是@字符串作为数组的名称
##格式是使用qw/内容/ 里面的内容是每个一行
@agelist=qw/19
23
27
32
54/;
print "$agelist[2] \n"; #正序提取数组,下标是从0开始的
print "$agelist[-2] \n"; #倒序取数组

#数组格式3,下标是从0开始的,使用的是@字符串作为数组的名称
##格式是使用qw(内容) qw后的格式就非常和shell的数组一样啦
@age2=qw(39 43 34 32 43);
print "$age2[2] \n"; #正序提取数组,下标是从0开始的


#哈希格式1
%hash_1=('a'=>1,'b'=>2);
#哈希格式2  第一个是key,第2个是value依次排列
%dat = ('Zhang',14,'Wang',28,'Li',34);
print "$dat{'Wang'}\n";

#数组的序列号
@var_10 = (1..23); #输出数字1到23
@var_av = ('a'..'v'); #输出字母a到v
print "@var_av\n";

#数组的大小,返回的是数组的物理大小,不是元素的个数
$len_av = @var_av; #获取的是数组的长度
$max_av = $#var_av; #获取的是数组的最后一个索引
print "av一共有$len_av个值,最大的下标索引是$max_av\n";

#添加和删除数组
##数组的末尾添加一个元素
$len_aw = push(@var_av,"w"); #注意是给var_av数组添加了w元素,同时返回的是添加后数组的长度
print "增加一个元素的aw是@var_av,长度是$len_aw\n";

##删除数组的最后一个元素
$lav=pop(@var_av);
print "删除最后一个元素后长度是$lav,数组现在是a到v,@var_av\n";

##数组的开头添加一个元素
$var_zw = unshift(@var_av,"z");
print "zw的长度是$var_zw,现在是@var_av\n";

##删除数组最开始的元素
$new_av = shift(@var_av);#返回的是删除的第一个元素的值
print "shift删除第一个元素是$new_av,现在是@var_av\n";

#提取数组
@var_ag = @var_av[0..6]; #返回的是提取的数组
print "@var_ag\n";

#替换数组
@km = ('k'..'m');
splice(@var_ag,3,5,@km); #替换了数组的第4到6项为k,l,m
print "替换后的数组是@var_ag\n";

#字符串转为数组
$name1=("/home/usr/soft");
@name1_list = split('/',$name1);
print "@name1_list[2]\n";

#数组转为字符串
$name2 = join('\\',@name1_list );
print "$name2\n";

#数组排序
@age3=qw(29 27 34 32 31);
@age3=sort(@age3);
print "sort后的数组是@age3\n";

#从列表中选择元素
@var_13 = @age3[1..3];
print "@var_13是提取的多个元素\n";

#查看哈希的大小 keys
%dat = ('Zhang',14,'Wang',28,'Li',34);
$dat_size = keys %dat; #查看哈希变量dat的大小
print "$dat_size\n";

#删除hash中的元素
delete %dat{'Li'};

#hash变量添加新的元素
$dat{'Zhao'} = '29';

#遍历hash变量
foreach $k ( keys %dat ){
    print "$dat{$k}\n";
}

#条件语句
$a = 100;
if($a>60){
    printf "a大于60!\n";
}else{
    printf "a小于60!\n";
}

if($a<60){
    print "不及格!\n";
}elsif ($a <80){
    print "中!\n";
}else{
    print "优!\n";
}

use Switch;
$var2 = 12;
@arr = (12,21,32);
%has = ('key1',23,'key2',12,'key3',34);
switch($var2){
    case 12 {print "数字是12\n";next;} #next是匹配后继续执行
    case [1..34,42] {print "数字在数组中 \n"} #此处匹配后不会继续执行后面的语句
    case (\@arr) {print "数组在arr中\n"}
    case (\%has) {"在hash中\n"}
    else {print "没有匹配的值"}
}

循环

for ($a=0;$a<10;$a=$a+1){
    print "$a\n";
}

$a=1;
do{
    print $a."\t".$a*($a+1)."\n";
    $a = $a +1;
}while($a <10);

运算符

$comp=<<EOF;
== 等于,返回true或false
!= 不等于,返回true或false
<==> 判断左右是否相等,相等返回0,左侧大于右侧,返回1.左侧小于右侧返回-1
> 大于,返回true或false
< 小于,返回true或false
>= 大于等于,返回true或false
<= 小于等于,返回true或false
eq 等于
ne 不等于
cmp 等价于<==>
gt 大于
lt 小于
ge 大于等于
le 小于等于
这些和上面的是一样的顺序,用法是 ($a gt 20 ),和shell里的判断字符是一样的

#算术运算符
+ - * / % **
## 加 减 乘 除 整除 乘幂

#逻辑运算符
and && 
or ||
not

#引号运算符
q{} 给字符串添加单引号 q{单引号},输出是'单引号'
qq{} 给字符串添加双引号 qq{一段话} 输出是"一段话"
qx{} 给字符串添加反引号 qx{date} 这样就可以执行shell的命令date

#其他运算符
. 连接两个字符串 "张三"."李四"
x 前面的字符重复n次,用法 "_" x 12  ,表示下划线重复12次
.. 表示范围
++ 自增运算符
-- 自减运算符
-> 指定一个类的方法
=~ 匹配的标志
!~ 不匹配的标志
=> 键值对,左键右值
EOF
print "$comp\n";
print "张三"."李四\n";
print "_—_" x 16; #输出_—_16次
print "\n";

时间日期

函数(子程序)

sub Sum1{
    print "hello world!\n";
}
Sum1();

#传入一串数字
sub Sum2{
    #获取传入参数的个数
    $n = scalar(@_);
    $sum = 0;
    
    foreach $item (@_){
        $sum += $item;
        print "$item\n";
    }
    $avg = $sum / $n;
    print "第一个参数值是".$_[0]."\n";
    print "均值是".$avg."总数是".$sum."\n";
}
Sum2(122,232,212,1023);

#传入数组
sub Sum3{
    my @list = @_;
    print "列表是:@list\n";
}
$a=10;
@b=(1,23,21,25,34);

Sum3($a,@b);

#函数中设置返回值
sub add_ab{
    return $_[0]+$_[1];
}
add_ab(122,107);

变量的作用域

大括号内是一个私有域

$func =<<EOF;
if while for foreach eval 这些都是一个私有域
my和local的区别
1.my和local都是在一个block内有效
2.local的变量可以在这个block调用的子程序中存在
3.block内的变量和外面的相同时,退出block后,不影响外部变量

如果在一个block中有一个my修饰的变量和外界的一个变量重名,
又需要在block中使用外部的变量。方法是:
our $global 或者 $main::global

#perl的引用
1.当在构建子函数时,如果传入的参数仅为标量,则不需要引用。
2.如果传入的参数为数组、哈希、标量的混合,则需要引用,并且在子函数中进行解引用。如果不使用引用,则作为输入的 @_,perl 无法区分变量,则整个打包了。
3.在子函数返回变量时,同样需要引用和解引用的过程
$scalarref = \$foo; #标量的引用
$arrayref = \@ARGV; #列表的引用
$hashref = \%ENV;   #哈希的引用 
$coderef = \&handle; #子过程的引用
$globref = \*foo #glob语句的引用

取消引用根据上面的对应类型使用对应的符合
$标量 @列表  %哈希
如果不知道变量的类型,可以使用ref来判断,返回值应该是下面的一种,如果都不是则返回false
SCALAR
ARRAY
HASH
CODE
GLOB
REF
EOF
print $func."\n";

引用函数

sub PrintHash{
    my (%hash) = @_;
    foreach $item (%hash){
        print "$item\n";
    }
}
%hash1 = ("张三",28,"Lisi",23);

#创建上面的函数的引用
$cref = \&PrintHash;

#使用引用调用函数
&$cref(%hash1);

#文件读写操作
$fileread=<<EOF;
<或r 只读方式打开,将文件指针指向文件头
>或w 写入方式打开,将文件指针指向文件的头并将文件大小截取为0,如果不存在则创建
>>或a 写入方式打开,将指针指向文件的末尾,如果不存在则创建
+<或r+ 读取方式打开,将文件指针指向文件的头
+>或w+ 读写方式打开,将文件指针指向文件的头并将文件大小截取为0,如果不存在则创建
+>>或a+ 读写方式打开,将文件指针指向文件的末尾,如果不存在则创建
EOF
print "$fileread\n";

正则表达式

匹配 // 或m//
替换 s///
转化 tr///

更多正则信息在
https://www.runoob.com/perl/perl-regular-expressions.html
https://www.runoob.com/regexp/regexp-tutorial.html
https://perldoc.perl.org/perlre#Regular-Expressions

相关文章

网友评论

      本文标题:perl的基础语法

      本文链接:https://www.haomeiwen.com/subject/focwirtx.html