zoukankan      html  css  js  c++  java
  • perl 入门知识(1)

    <一> 语句及注释:

    Perl 语句以分号(;)结尾,用 # 作为一行的注释,没有其它语言中那种跨行的注释。代码块用大括号围起来,这个和 C 类似,但这个大括号在有些地方是强制要求,如在 if ,for,do, while 等语句中,它不像其它语言一样会用缩进来判断块。

    <二> 变量: 标量(scalar) & 列表(list)

    Perl把简单的数据类型,如字符串,数字等“单数”的东西统称为标量,与之相对的,就是“复数”的东西,如数组。标量的声明都是 $ 开始,如:  $str = "abc"。多个标量也可以放一处一起声明:

         ($x, $y, $z) = (11, 22, "no");

    数组的声明则是以@开头,如:@arr = ("abc","edf")。变量的声明和很多其它脚本语言一样,不需要指明类型,直接声明赋值就可以使用。如果只声明但不赋值,Perl 会默认给它赋值为:undef

    为了检查一个变量是否已被赋值,Perl 提供了一个操作符:defined,用于判断一个变量是否已经被赋值

         if( !defined( $myvar ) ) 

        {

           print "uninitialized variable";

        }  

    <三> 字符串

    (1) 基本语法

    在 Perl 中,所有字符串都是双引号或单引号括起来的,如: "string"  'string'。这两种方式在很多时候相同,不同的是当字符串出现其它变量或转义符号的时候,双引号会将变量的内容展开,而单引号的不会,这和 shell script 是相似的,如:

           $var = 234;

           $str1 = "str1:$var";    # 打印出来得到-> str1:234

           $str2 = 'str2:$var';     # 打印出来得到-> str2:$var

     (2) 字符串拼接

    点号(.)用于把字符串进行拼接,这个和其它一些语言直接把字符串连在一起就行不一样,要用点号把字符串连起来,如:

       $str = "abc"."efg";  # abcefg

    这个用法,和 shell script , vim script 也是一致的。  

    (3) 比较

    这里需要强调的,字符串的比较要用:

    •     lt    小于 
    •     gt   大于 
    •     eq   等于

    而不要用== , >=  , <= ,这些符号是用来比较数值类型的。 

    <四> 数组

    (1) 声明

    如前所说,数组是一个复数(plaural)形式的变量,它的声明是以@开头的,后面跟着小括号放入初始值

         @arr = (12,34,56);

    同一个数组里的元素类型不一定要一样,下面的写法也是合法的:

         @arr = (12,"abc",'c');

    当然,也可以声明空数组:

         @arr = ();

    声明字符串数组时,可以用 q,qq,qw 系列操作符简化操作。q 代表 quoted,  qw 代表: quoted word.

         @arr = qq(abc);   # 等价于 ("abc")

         @arr = qw(abc ef gg);   # 等价于("abc","ef","gg")

         @arr = q(abc);    # 等价于('abc') 

    由上看出 qq 与 qw 的区别就在于,qq 是将括号中的整个内容当成一个整体加上双引号,而 qw 是以空格为分隔,如上第二个例子,abc, ef, gg 分别被加上了双引号,而 q 与 qq 相似。这几个操作符的好处在于,当你想在字符串加入转义符号,引号等符号时,会方便很多。

         qq(abc)  eq  “\abc"

         qq("abc") eq ”"abc""

    (2) 数组访问,插入

    如果想访问数组里的元素,就用中括号加下标的方法,和很多其它语言一样,perl的数组元素从0开始算:

         print $arr[2];

    有人可能注意到了,引用里面元素的时候,又用了$,而不是@。这里其实有一个原则,用@时,是表示整个数组,而引用其中的元素时,就用 $,后面将讲到hash类型数组,也是同样的原则。上面是一次访问一个元素,如果需要取出 sub array(切片), 则应如下写:

         @sub_arr = @arr[1,4];

    Perl 中的数组是没有指定大小的,如果访问了没有定义的元素,就会返回 undef:

         @arr = (1,2,3);

         $ele = $arr[20]; # ele == undef

    如果要往数组中加入新元素,也可以直接用中括号+下标:

         $arr[4] = 4; #如果不存在第4个元素就插入,存在就覆盖。    

    (3) 转换

    下面提一个很体现 Perl 风格的问题,前面说到,用@引用 一个数组时,表示对整个数组的引用,但这种引用在不同场合下(context)是表示不同含义的:

         @arr = ("abc", "ed");

         print "arr: @arr" ;

    上面的 print 会将 arr 中的元素一个个的提取出来展开打印,这个好理解,但如果我这样写呢:

         $sz = @arr;  #

    把数组赋值给一个标量,Perl 会把数组的大小赋值给左边的变量,所以上面的例子里,$sz 等于2。如果Perl没法判断,当前上下文是标量还是数组,默认情况下,@arr 都会展开数组:

         @arr2 = (1,2,@arr);  # arr2 == (1,2,"abc","ed").

    但如果这时候,我是想让 @arr 当作标量来处理,怎么办?上面的写法是不行的。Perl 规定,如果想要指明转换为标量类型,就需要加上关键字: scalar.

         @arr2 = (1,2,scalar @arr);  # arr2 == (1,2,2)     

    (4) sort 排序功能

    Perl 为数组提供了排序操作符:sort。默认情况下,sort 对数组里的元素按字母排序,然后返回一个新的数组,旧数组不变。

            @arr = ("abc","rsz","ef");

            @newarr = sort(@arr);

             #  arr = abc rsz ef    newarr = abc ef rsz.

    如果数组里存的不是字符,或你不想按字符序排序, 可以指定按数字的方式排序

             sort ({$a <=> $b} @array) 

    大括号表示一个比较函数,<=> 是指数值比较,$a 和 $b 表示比较的两个数,这两个变量是语言预定义的变量不可以更改。如果把a,b的顺序调换一下,就表示反过来排序,如果用了数值排序,而数组中又有字符串元素,那字符串都被当作 0,如果有多个字符串,字符串之间仍按字母序来排序。如:

            @arr = (22,44,33,-12,gg ,hh)

            sort({$a<=>$b @arr);  #   结果:-12 gg hh 22 33 44   

    (5) 插入,删除。 

    Perl 提供了 push, pop, shift, unshift 等函数对数组进行入栈出栈之类的操作。push 和 pop 作用在尾部,shift 与 unshift 作用在头部。

              @arr = ("ab","bc","ee");

              pop @arr;   # 结果:("ab","bc")

              push(@arr,"hh");  #结果: ("ab","bc","hh")

              shift @arr;   #结果:  ("bc","hh")

              unshift(@arr, "vv"); #结果: ("vv","bc","hh")

    <五> hash 数组

    (1) 声明与初化

    Perl 里的 hash 数组类似于 python 里的 dict, c++ 中的 map。数组中保存的是 <key,value> 一对值hash 数组用 % 来声明

         %hash = ("key1","value1","key2","value2");

         print "v1:$hash{key1}";  #打印出:value1.

    上面的初始化语句在 key,value 很多时可读性很差,因此,Perl 又提供了另一种写法:

          %hash = ("key1"=>"value1","key2"=>"value2");

    其中符号 => 与逗号的效果是完全一样,但这种写法看起来,就比较容易分辨别哪个是 Key, 哪个是 value.

    (2) 插入,删除与修改

    hash 的插入与修改在语法上是完全一样的。

             $hash{"key"} = "value";

    如果 hash 数组中原来没有 “key”,就插入;如果有"key"及相应"value",如果原来有相应的 "key",就修改相应的 value 为新的 “value"。与此同时,Perl 提供了一个 delete 操作符来删除 hash 中的元素,如: delete $hash{"key"};

    (3) 获取 key 与 value.

    Perl 提供了keys 和 values 这两个函数来获取 hash 中的全部 key,value。这两个操作符返回的是一个数组,如:

                     %hash = ("k1"=>"v1","k2"=>"v2");

                     @k = keys (%hash);    #k == ("k1","k2")

                     @v = values(%hash);   #v == ("v1","v2")

    REF:

    http://www.cnblogs.com/catch/archive/2013/05/25/3096963.html

    https://wenku.baidu.com/view/72373031e45c3b3567ec8bd1.html

  • 相关阅读:
    GhostBSD 3.0RC3,基于GNOME的FreeBSD
    Nagios 3.4.3 发布,企业级监控系统
    Jolokia 1.0.6 发布, JMX远程访问方法
    微软希望开发人员不要使 WebKit 成为新版 IE6
    Kwort Linux 3.5 正式版发布
    EJDB 1.0.24 发布,嵌入式 JSON 数据库引擎
    Pale Moon 15.3 Firefox“苍月”优化版发布
    Galera Load Balancer 0.8.1 发布
    SmartSVN V7.5 正式发布
    PostgresQL建立索引如何避免写数据锁定
  • 原文地址:https://www.cnblogs.com/emanlee/p/6853582.html
Copyright © 2011-2022 走看看