设为首页 收藏本站
查看: 1067|回复: 0

[经验分享] Perl-收藏之前的学习笔记

[复制链接]

尚未签到

发表于 2015-12-27 13:27:49 | 显示全部楼层 |阅读模式
  Perl特别适合系统管理和Web编程
假如print的调用看起来像函数调用,它就是一个函数调用。
除非这样做会改变表达式的意义,否则perl的括号可以省略。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PERL中的特殊变量
  1 die的处理方式:
$! : 根据上下文内容返回错误号或者错误串
$^E:在非UNIX环境中的操作系统扩展错误信息
~~~~~~~~~~~~~~~~~~~~~~~~~
2  模式匹配中的特殊变量:
$&   用来存放匹配中的值
$`   用来存放匹配中之前所有字符
$'   用来存放匹配中之后所有字符

******************************************************************
Perl文件读取的几种处理方式小结
*******************************************************************
1、单行(大文件处理)
my  $oneline = <$FL>或者
while ($line = <H>)
{}
~~~~~~~~~~~~~~~~~~~
2、读取全部(小文件处理)
open(my $in, "path") or die "Can't open the file!\n";
my @lines = <$in>;
~~~~~~~~~~~~~~~~~~~~~~
3 、读3行(大文件及特殊处理需要):
open (my $in, "path ") or die "open error: $! ";
my @lines;
push (@lines, scalar <$in> ) for (1..3);
~~~~~~~~~~~~~~~~~~~~~~~~
4、每次按条件读入三行,并且按条件输出两行。或根据其他具体要求修改达到相应目的。
  while (<TEST>) {
    if(index ($_, "=") > -1){
       my $position=tell(TEST);
       my $keyword_line=$_;
       my $line_1=<TEST>;
       my $line_2=<TEST>;
    # @a=split//,$keyword_line;  比较它们的元素是否相等,一直没成功
    # @b=split//,$line_1;         利用if ($a[0]eq $a[0])来判断
    # @c=split//,$line_2;
         if (($line_2)&&(index($line_2, "=")>-1)){ # 或者if ($line_2=~/=/)
            print OUTFILE "$_$line_1";
          }
    if (!($line_2)) { print OUTFILE "$_$line_1"; last; }
    seek(TEST, $position, 0);
      }
  }
  
  ********************************************************************
第四章:子程序
********************************************************************
在Perl中,所有的子程序都有一个返回值,但并不是所有的Perl子程序都包含有用的返回值。
  子程序中的最后一次运算的结果,都会被自动当成子程序的返回值。
sub marine {
$n += 1;
print "Hello, sailor number $n!\n";
}
调用子程序:&marine;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
返回值:
在Perl中,所有子程序*都有*一个返回值,
没有return的情况下,最后一次的运算结果就是返回值。
print语句的返回值,通常是1,代表输出成功。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
参数:
perl子程序可以有参数(argument),要传递参数列表到子程序里,只要在子程序调用的后面
加上被括号圈引的列表表达式,就行了。
$n = &max(10, 15);
perl会自动将参数列表化名为特殊的数组变量@_,该变量在子程序执行期间有效。
@_变量时子程序的私有变量。
子程序可以访问@_数组,以判断参数的个数和参数的值。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
词法变量——my:
my可以使用在任何块(block)中,而不是局限于子程序中的语句块。
词法变量的作用于受限于最内层的语句块。
*****my操作符并不会更改变量赋值时的上下文:********
my($sum) = @_;#列表上下文,和($sum) = @_相同,第一个参数
my $sum = @_;# 标量上下文,和$sum = @_相同,参数的个数
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
return操作符:
  
  
  *********************************************************************
第5章:输入输出
*********************************************************************
读取标准输入
  "行输入"操作符=><STDIN>
$line = <STDIN>
chomp($line);
或者:
chomp($line = <STDIN>)
如果读到文件结尾(end-of-line),行输入操作符就会返回undef。这样的设计是为了
配合循环使用,可以自然的跳出循环:
while (defined ($line = <STDIN>)) {
print “I saw $line”;
}
上式的简写:
while (<STDIN>) {
print “I saw $_”;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
钻石操作符:<>
参数的使用=>在程序运行时指定程序的输入源。
程序的调用参数(invocation arguments)是命令行上跟在程序后面的几个“单词”。
若不提供任何参数,程序会启动标准输入流。
(-)=>连字符参数=>代表标准输入。
  钻石操作符是“行输入”操作符的特例=====>>>>> 它并不是从键盘中取得输入,而是从用户
指定的位置读取。
exp:
while(defined ($line = <>)) {
chomp($line);
print "It was $line that I saw!\n";
}
可以简写为:
while(<>) {
chomp;
print "It was $_ that I saw!\n";
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
调用参数:(不是子程序中的参数,而是调用程序时的所输入的参数)
@ARGV=>>>>>>由Perl解释器事先建立起来的特殊数组,其内容是调用参数组成的列表。
钻石操作符不是直接去检查参数,而是去读取@ARGV
shift @ARGV
foreach @ARGV
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
输出到标准输出:
print操作符会读取一个列表里的所有值,并把每一项(当然是一个字符串)
依次送到标准输出。
它在每一项之前或者之后都不会再加上额外的字符。
  直接使用数组VS使用数组内插
print @array;#把数组的元素打印出来=>>>>>(abd)
print “@array”#打印出一个字符串(数组内插的结果)=>>>>>>(a b c)
  
print 后面的括号可有可无,下面的两种方法会输出一样的东西:
  print ("Hello, world!\n");
print "Hello, world!\n";
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
文件句柄:(filehandle)=>全用大写
文件句柄是程序里代表Perl进程与外界之间的I/O联系的名字。它是这种联系的名字,
不一定是文件名。
  *******************************************************************
第6章:HASH
*******************************************************************
HASH:就是一种数据结构。和数组类似。
和数组的区别:不是以数字来检索,而是以名字来检索。即键是保证唯一的字符串。
     在哈希里,没有顺序,只有键/值对。
访问哈希元素:
$hash{$some_key}
%family_name
$family_name{"fred"} = "flintstone";
  *********************************************************************
第7、8章:正则表达式
*********************************************************************
m//:可以简写为//;可以用任意成对定界符:()   <>  {}  
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
模式分组
  ()用来分组
反向引用
\1   \2     #用来引用圆括号中的模式所匹配的文字。
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
字符集
[.]#可能出现的字符集合,只匹配单个字符,可以是字符集里面的任何一个
简写:
\d => [0-9]
\w => [A-Za-z0-9_]
\s => [\f\t\n\r]#灵活的匹配空白,包括:换页、制表、换行、回车、空格。
\D => [^\d]
\W => [^\w]
\S => [^\s]
  
[?]#表示前一个条目是可有可无的 匹配前面的内容零次或者一次
  • #匹配前面的内容零次或多次
    [+]#匹配前面的内容一次货多次
    [.]#任何单字符的通配符
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    可选修饰符
    /i#进行大小写无关的匹配。
    /s #匹配任意字符,包括换行符
    /x# 能够在模式里面加入空白
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    锚位:
    (^)#是一个锚位,用来标示字符串的开头。
    ($)#是一个锚位,用来标示字符串的结尾
    \b#单词边界锚位,匹配任何单词的首尾
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    *****************脱字符(^)的两个用途:******************
    1-反义表示:在字符集匹配中表示要匹配的字符除外=>[^\s]=>匹配除空白之外的任何字符
    2-开头锚位:在字符集之外,代表字符串的开头。=>/^\s*$/=>匹配空白行
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    绑定操作符
    =~     #模式匹配任意对象。
      默认的模式匹配的对象时$_,但是=~能让Perl拿右边的模式来匹配左边的字符串。
    例子如:
    my $some_other = " I dream of betty rubble ';
      if ($some_other =~ /\brub/) {
         print "Aye, there is the rub.\n";
    }
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~
    模式串中的内插   
    ===>>>>>相当于UNIX中的grep命令
      
    #!/usr/bin/perl -w
    my $what = "larry";
      while (<>)  {
    if (/^($what)/) {
    print "We saw $what in beginning of $_";
    }
      $what 不一定来自字符串,也可以从@ARGV里的命令行参数取得:    #@ARGV包含了
    程序从命令行得到的所有参数 。

    用例:my $what = shift @ARGV;
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    捕获变量  $1 $2 $3...
    ===》》》捕获:把(圆括号中的模式所匹配的)部分字符串暂时记下来的能力
    exp:
    $_ = "hello there,neighbor";
    if (/\s(\w+),/) {#捕获空白符和逗号之间的单词
    print "the word was $1\n"; #打印the word was there
    也可以一次捕获多个串:
    $_ = "hello there,neighbor";
    if (/(\S+) (\S+), (\S+)/) {
    print "words were $1 $2 $3\n";#打印words were hello there neghor 没有逗号!
      捕获变量的生命期;
    不捕获模式:(?:)#告诉perl这完全是为了分组而存在
    自动匹配变量:$&    $`    $'
    #不必使用圆括号就能引入
    exp:
    if ("hello there, neighbor" =~ /\s(w+),/) {
    print "That actually matched '$&' .\n";#第一个捕获there在$1 中,第二个捕获 there, 在$&中
    }
      if ("hello there, neighbor" =~ /\s(w+),/) {
    print "That was ($`) ($&) ($') .\n";#匹配起始位置之前的字符串放在$`中,之后的在$'中。
    }
      
    ****************************************************************************
    第九章:用正则表达式处理文本
    ****************************************************************************
    用s///替换    =》 只进行一次替换
    exp:
    $_ = "He's out bowling with Barney tonight.";
    s/Barney/Fred/; #把barney替换为Fred。
    print"$_\n";
      用/g进行全局替换:    =>/g修饰s///以达到全局替换的效果
    exp
    $_ = "home, sweet home!";
    s/home/cave/g;
    print"$_\n";#打印 “cave , sweet cave”;
    将任何连续的空白转换成单一空格:
    s/\s+/ /g;
    去除结尾和开头的空白字符:
    s/^\s+//;#删除开头的空白字符
    s/\s+$//;#删除结尾的空白字符
    s/^\s+|\s+$//g;#删除开头和结尾的空白字符
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    可选修饰符:
    绑定操作符=~
    大小写转换:
    \U 和 \u
    \L 和\l
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    split操作符:    =>根据分隔符拆开一个字符串
    exp:
    @fields = split /separator/, $sting;
      @fields = split /:/, "abc:def:g:h"#得到("abc", "def", "g", "h");
    利用/\s+/ 模式进行空白分割:
    my $some_input = "this is   a   \t            test.\n";
    my @args = split /\s+/, $some_input;#("this", "is", "a", "test.")
    split默认会以空白字符分割$_:
    my @fields = split;#等效于  split /\s+/, $_;
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    join 函数:=>与split相反
    exp:
    my $x = join ":", 4, 6, 8;#$x is "4:6:8"
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    跨行的模式匹配:
    接下来的程序会先把整个文件读入一个变量,然后把文件名前置于每一行的开头。
    open FILE, $filename
    or die "Can't open '$filename':$!";
    my $lines = join ' ' ,<FILE>;
    $lines =~ s/^/$filename: /gm;
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      

  • 运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
    2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
    3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
    4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
    5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
    6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
    7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
    8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

    所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-156972-1-1.html 上篇帖子: Perl中的@INC 及引用pm顺序 下篇帖子: perl的sort函数
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    扫码加入运维网微信交流群X

    扫码加入运维网微信交流群

    扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

    扫描微信二维码查看详情

    客服E-mail:kefu@iyunv.com 客服QQ:1061981298


    QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


    提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


    本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



    合作伙伴: 青云cloud

    快速回复 返回顶部 返回列表