perl小结

    技术2022-05-19  33

    以下纯属个人学习总结,如有问题或疑问请指出

    perl语言学习总结:

    1.获取用户输入

    $line = <STDIN>;

    if($line eq "/n"){

     print "你按下了回车";

    }else{

     print "你没有按下回车";

    }

    2.去除换行符

    $text = "a line of text/n";

    chomp($text);

    3.while控制结构

    $count = 0;

    while($count<10){

    $count += 2;

    print "count is now $count/n";# 2 4 6 8 10

    }

    4.如何定义一个数组以及怎么访问数组中的元素

    @fred = ("11","22","33","44","55");

    print $fred[0];#控制台打印11

    $count = 0 ; 

    while($count<$#fred+1){#  $#fred 获取数组的索引  

     print "$fred[$count],";//#  控制台打印 11,22,33,44,

     $count++;

    }

    5.列表直接量

    ("11","22","33","44");

    6.pop和push操作符

    pop 获取数组中的最后一个元素

    @array = 5..9;

    $fred = pop(@array);# 在控制台打印的是9

    push 添加一个元素(或是一串元素)到数组的尾端

    push(@array , 0); # @array 现在是5,6,7,8,9,0

    7.shift和unshift操作符,shift与unshift操作符是对数组的"开头"或"结尾"进行相应的操作

    @array = qw# hello word #;

    $m = shift(@array); # $m 变成"hello",@array 现在是("word")

    unshift(@array,"hello"); # @array 现在是("hello","word")

    8.字符串的数组内插

    @rocks = qw{hello word};

    print "my first @rocks";

    9.foreach 控制结构

    foreach $example (qw/ hello word /){

     print "$example/n";

    }

    10.perl 中的$_ 使用  术语:perl的 老地方

    foreach(1..10){

     print "$_";

    }

    11.reverse 操作符, 该操作符会读取列表的值(可能来自数组),并按相反的次序返回该列表

    @array = 1..5;

    print reverse(@array);

    12.sort 操作符的使用,将数组进行相应的排序

    @array = ("dd","aa","cc","bb");

    print sort(@array); # 控制台输出 aa bb cc dd

    13.标题上下文与列表上下文

    @array = ("aa","bb","cc");

    @list = @array; 

    print @list; # 控制台输出 aa bb cc 列表赋值

    $n = 1+@array;

    print $n; # 控制台输出4  标量赋值

    14.强制指定标量上下文

    @rocks = qw(hello word);

    print @rocks;

    print scalar(@rocks);

    15.子程序(就象java中的方法)

    #创建

    sub xx(){

     $_[0]+$_[1];

    }

    #调用 

    $number = &xx(1,2);

    print $number; # 控制台输出3

    16.子程序中的私有变量

    sub max(){

     my($m,$n) = @_;# 将保存在@_中的参数赋值给具体的变量

     if($m>$n){

      $m

     }else{

      $n  

     }

    }

    17.长度可变的参数列表

    sub max(){

     if(@_ != 2){

      print "你传入的参数个数不正确!";

     }

     my($m,$n) = @_;# 将保存在@_中的参数赋值给具体的变量

     if($m>$n){

      $m

     }else{

      $n  

     }

    }

    18.更好的&max 子程序,可以让它能接受任意数目的参数

    sub max(){

     my($max_so_far) = shift(@_);# 数组中的第一个值,暂时把它当成最大值

     foreach(@_){# 遍历数组 @_中的其他元素

      if($_ > $max_so_far){# 看看是否当前的元素比$max_so_far大?

       $max_so_far = $_; 

      }

     }

     $max_so_far;

    }

    #上面的程序使用了"高水线"的算法

    print max(1,6,21,32);# 32

    19.关于词法(my) 变量

    my $aa,$bb;# $bb 没有声名

    my($aa,$bb);# 正确

    my @cc # 也可以声名私有数组

    20. use strict

    个人感觉没有什么太大用途

    21.return 的使用

    my @names = ("aa","bb","cc","dd","ee");

    my $value = &which_element_is("cc",@names);

    print $value;

    sub which_element_is{

     my($what,@list)=@_;

     foreach(0..$#list){

      if($what eq @list[$_]){

       return $_;

      }

     }

     -1;# 这里也可以写成-1

    }

     

    其他控制结构

    1.unless控制结构:他与if中的条件刚好相反if(true){....} unless(false){....}

    2.Until 控制结构:他与while中的条件刚好相反while(true){....} Until(false){.....}

    3.条件修饰词:print "$n is a negative number./n" if $n < 0 相当于if($n < 0){print "$n is a negative number./n"}

    4.last操作符,相当于java中的break

    5.next操作符,相当于java中的continue

    6.redo操作符,它能将控制返回到本次环的顶端,不经过任何条件测试,也不会进入下一次循环迭代

    哈唏  {} 哈唏必须以花括号进行处理

    1. $hash{"xx"} = "xxx";# 给xx这个哈唏进行赋值

    print $hash{"xx"};# 输出xxx

    2. %hash=("a"=>1,"b"=>2,"c"=>3);#这是一个哈唏列表,a,b,c 都是key ,而1,2,3则是值

    print %hash;#输出a1b2c3.这里的输出不一定是这种顺序的,因为哈唏出来的值是无序的

    3. keys 和 values 函数

    my %hash = ("a"=>1,"b"=>2,"c"=>3);

    my @key = keys(%hash);# 输出abc

    my @value = values(%hash);# 输出123

    print @key , @value;

    4.each函数 罗列哈唏的每个键/值对

    while(($key , $value) = each %hash){

     print "$key => $value/n";

    }

    5.exists函数  检查哈希中是否有某个键

    if(exists $hash{"a"}){

     print "这个hash中有这个键";

    }

    6.delete 函数 从哈希中删除指定的键及其相对应的值,假如没有这个键  也不会出现任何警告或错误信息

    delete $hash{"a"};

    正则表达式:正则表达式,在perl中常常叫做模式,是一个匹配某字符串的模板

    1. $_ = "hello world";

    if(/llo/){#查看llo在整个标量中是否存在

     print "";

    }

    2.关于元字符

    点号 .   /wyl.xx/ # 说明wyl 任意字符(必须是一个字符) xx

    星号(量词) * /wyl*xx/ # 说明wyl 任意字符(可以有任意多个字符) xx

    点星.*  捡破烂模式

    加号(量词) + /wyl +xx/ # 说明wyl 空格(必须要有一个的空格才行?) xx  如果是wylxx 这样不满足条件的

    问号(量词) ? /wyl?xx/ # 之间也可以有字符也可以没有字符

    圆括号 () /(wyl)+/ # 他会匹配wylwylwyl这种字符串

    /1 /2 /3 反向引用  $_ = "abba";if(/a(.)/1/){print "true";}#输出true

    或符号 | 择一匹配  $_ = "wyl and wxs"; if(/wyl and|or wxs/){print "true";}#输出true

    字符集 是指一串可能出现的字符集合,通过写在方括号[]内来表示.它只匹配单个字符,但可以是字符集里列出的任何一个.

    第一个经典的字符集  [a-zA-Z] :这个字符集可以匹配52个字母中的任何一个

    [abcwxyz] 会匹配这7个字符中的任何一个。

    脱字符 (^)   [^abc] 会匹配这三个字符(包含这三个字符)以外的任何字符. [^n/-z] 则匹配n 、连字符与z以外的任何字符

    字符集简写

    [0-9] 可以简写成/d

    [A-Za-z0-9_] 可以简写成/w

    /s 简写擅长处理空白,它相当于[/f/t/n/r]  比较常见的做法是使用/s*来匹配任意数目的空白(也包括零个空白),或用/s+来匹配一个以上的空白字符

    /h 简写能匹配横向空白,其实就是一个包含制表符和空格的字符集[/t ]

    /v 这个简写用来匹配纵向的空格,其实也就是写[/f/n/r]的快捷方式

    /r 简写能匹配任何类型的断行,这给跨操作系统的断行匹配带来了便利,因为/r知道各种风格的断行方式.

    [/d/D] 表示任何数字或非数字

     

    以正则表达式进行匹配

    1. 以m//进行匹配

    m// 就是前面的/xxx/ 的简写。向 / / 符号就是定界符. 还有其它的如:m(xxx),m<xxx>,m{xxx},m[xxx] 等等

    这里有个简写:如果你选择双斜线作为定界符,那么你可以省略开头的m。因为perl程序员们喜欢省略多余的字符,所以大部分的模式匹配都会以双斜线来编写,就象/xxx/这样。

    常见的定界符是花括号。在程序员专用的编辑器里,可能会具有从左花括号跳到相应右花括号的功能,这在维护上有很大的帮助。

    2.可选修饰符

    定义:这是一些可有可无的修饰字符,有时候称为开头。它们可以成组附加在某个正则表达式结尾的定界符的右边,并改变正则表达式的默认行为。

    用/i 来进行大小写无关的匹配

    chomp($_=<STDIN>);

    if(/yes/i){

     print "true";#  如果你输入YES,控制台也会打印true 

    }

    用/s来匹配任意字符 

    $_="how are you/nwang yl";

    if(/are.*yl/s){

     print "yes true";# 控制台会打印yes true

    }

    用/x加入空白

    这个修饰符能够在模式里面随意加上空白,目的是使它更容易阅读、理解。

    /-?/d+/.?/d*/ # 都挤在一起,很难看清是什么意思

    / -? /d+ /.? /d* /x # 加入空白后,稍微清楚些

    组合选项修饰符

    如果在一个模式中使用多个修饰符,可将它们连在一起使用。它们之间的先后顺序并不会影响匹配的结果:

    if(/xx/is){# 同时使用 /i 和 /s

    }

    # 可以进行注释

    $_="how are you/nwang yl";

    if(

     m{

      are # 这是一个数量词

      .* # 之间的任何东西

      yl # 随便写的

     }sx #匹配任意字符

    ){

     print "yes true";

    }

    锚位

    锚位:默认情况下,模式匹配的过程开始于待匹配字符串的开头,如果不相符就往字符串后面浮动,看其它位置能否匹配。但是加入一些锚位,可以让模式直接匹配字符串的某处。

    ^ 脱字符 是一个锚位 用来标示字符串的开头,

    $ 也是一个锚位,用来标示字符串的结尾

    单词锚位

    锚位并不局限于字符串的首尾。比如/b是单词边界锚位,它匹配任何单词的首尾。

    //bwangyl/b/  它只能匹配 wangyl     而不能匹配wangylhowareyou

    这里所说的单词并不是一般的英文单词,而是由一组/w字符构成的字符集,也就是由普通英文字母、数字与下划线组成的单词。/b 锚位匹配的是一组/w字符的开头或结尾。

    单词边界锚位非常有用,它保证我们不会意外地在delicatessen中找cat、在boondoggle中找到dog或在selfishness中找到fish。有时候、你只会用到一个单词边界锚位、像用//b/来匹配hunt、hunting或hunter,而排除了shunt;或是用/stone/b/ 来匹配standstone事flintstone,但不包括capstones。

    非单词边界锚位是/B,它能匹配所有/b不能匹配的位置。

    因此,模式//bsearch/B/会匹配searches、searching与searched,但不匹配search或researching。

    绑定操作符

    默认的情况下模式匹配的对象$_,绑定操作符=~ 则能让perl拿右边的模式来匹配左边的字符串,而非匹配$_。相当于java中的==  equal()

    实例:

    my $some_other = "hello wangyl , how are you.";

    if($some_other =~ //byo/){

     print "true";#控制台输出true;因为$some_other 中包含yo

    }

    模式串中的内插

     $what = "sky";

    while(<>){

     if(/^($what)/){

      print "$what of $_";#当输入sky  则在控制台输出sky of sky

     }

    }

    捕获变量  看的我有点头晕

    字符串操作与排序

    用index进行搜索字符串

    my $stuff = "hello world!";

    my $where = index($stuff,"word");#控制台输出6

    my $where = index($stuff,"word",2);# 这里的2的意思是从第二个字符开始搜索,这样会提高搜索效率。

    用rindex进行匹配最后一次出现一个字符的位置

    my $stuff = "hello world!";

    my $where = rindex($stuff,"d");#输出10

    my $where = rindex($stuff,"d",2);# 这里的2的意思是从第二个字符开始搜索,这样会提高搜索效率。

    用substr处理子串

    语法:

    $part = substr($string,$initial_position,$length);

    它需要三个参数:一个字符串、一个从零起算的起始位置(类似index的返回值)以及子串的长度。找到的子串会被返回。

    my $xx = substr("hello wangyl",6,5);#wangy

    my $xx = substr("hello wangyl",6);#wangyl

    my $xx = substr("hello wangyl",6,50000);#wangyl

    my $xx = substr("hello wangyl",-3,2);#gy

    my $xx = substr("hello wangyl",-3,2000);#gyl

    sprintf 进行相应的格式化

    my $money = sprintf "%.2f", 2.49997;#2.50

    目标操作


    最新回复(0)