因为项目需要, 要改进一个抓取网页内容的脚本, 用到了perl,从刚开始看到别人的perl脚本就感觉象天书,到今天已经正常work了一天一夜的脚本, 这三天时间里的一些收获,主要是一些,大家一般来说不太容易理解的概念,或者说是,在C/C++,PHP,JAVA,JS中不常见的一些个语法,  给初学perl的朋友一些启示, 当然,对于perl牛人来说,就不值得一看了....

        恩,总的来说,perl是很强大的, 易用难学, 尤其对于他的那些个很随意的语法, 有人说的对,学习perl就是在学习larry的思考方式.

        perl其实只有3种变量类型,标量($),数组/列表(@),散列(%).对于初学者来说,最要注意的就是变量的上下文环境.

        perl有一条很重要的约定,只要一个函数看起来象函数,你就可以省略掉函数后的()操作符. 比如,print $a.一般来说,对于自定义函数,我觉得还是必要使用&来表明是函数调用.

    perl的引用是使用\, 比如 $SIG{"INIT"} = \&function.  myFunction(\$intPara, \@ArrPara);

    perl的函数调用传参,都是"按引用"传值,我之所以括起来,是因为在perl中没有"按值","按引用"的这个概念.

    对于标量上下文和列表上下文, 常见的问题就是 $a = <FILE> 这样是取得所有的文件内容, 各行是连接在一起的, 而@a=<FILE>是取得一个数组,文件中的一行是一个元素.

    还有就是,对于一个数组,$arr  print $arr 输出元素个数  print @arr输出元素, 当然也是由于不同的上下文引起的.

    []可以产生一个匿名数组的引用,所以当你看到这样的代码的时候,不要惊奇 @a = @{ [1,2,3]};

    在perl中比较郁闷的控制结构就是unless了, 呵呵, 开始的时候,我也搞糊涂过几次, 你只要记得,unless是"除非后面的表达式是真,否则就执行".

    我最欣赏perl的地方就是,这样的条件后置的语法  return $html if($html eq "err");  EXPR unless Con,等等

    perl中字符串比较用(eq, lt ,gt ,le ,ge,ne),数字用(==, <, >, <=, >=, !=);

    函数原型定义的时候,如果带有参数比如, sub function($$){...}, 表示,申明了函数接受的参数类型和数量,帮助编译器检查.

    最重要的变量$_, 一定要注意,呵呵, 否则看到这样的代码 ,你就纳闷了, print; sort;

    $|变量,当你不希望你的输出被缓存,将此变量设置为1,默认为0。

    对指针,即引用的做解引用,列 my @a = @{[1..100]};

      注意到上面的[1..100],这是perl的一种语法,意思是,生成了,从1到100,100个元素的列表;

    如果你想获取执行外部的shell的返回内容,使用反引号(一般来说是,在键盘esc下面的键);

        比如 my $a = ps | grep perl;

    另外 ,对于文件测试,比如,if -e '/home/y/xinchen/test.pl' && -b '/home/y/xinchen/test.pl' ,这样的测试语句,如果存在这样的文件话,perl会俩次请求外部的文件state缓冲内容,这个时候,你就可以使用特殊文件句柄“_",来直接访问上次 取回的state缓冲内容,减少一次与外部通信的代价。

        正则表达式的绑定操作符,=~,刚看到这个确实闷我了很久,后来才知道,当你默认的使用正则匹配的时候,perl会默认的对默认变量$_进行正则匹配,而这个操作符,指明了要匹配的对象:

         $a=~m#[a-z]*#ig; 对变量a进行正则匹配;

     do函数,do函数其实可以理解成一种inline函数,他会对他后面的语句块返回改语句块的返回值。

     对了,还有一个很重要的概念,在perl中,函数都有返回值,如果没有执行return,返回值是函数的最后一个表达式;比如:

       sub test{

         if($_[0] == 11_13)

                 code...

          else

                 code...

           $str = 'laruence';  #这个是返回值

}

    对了注意到上面的11_13, 在perl中,你可以任意对你的数字加上下划线,方便human readable;

    在Perl中,所有的IF语句的执行块都要用{}包起来 ,比如如果你习惯了C++语法,写下如下代码 ,

               if($cond) print "yes, Condition is true";

    那么等待你的将是:syntax error!

    Perl中的引用,就是保存地址的标量变量, 需要注意的是, 生成一个匿名数组的引用使用[].而一个匿名散列的引用使用{};比如:

                $arrRef = [1..200];

                $hashRef = {"b"=>1,"a"=>2,"r"=>3,"i"=>4,"l"=>5};

    访问其中的子元素,对于指向数组的引用可以使用:

                @$arrRef[1], 或者 $arrRef->[1];

    对于散列 可以使用:

                %$hashRef[a], 或者 $hashRef->{a};

    对于初学者来说,一定要,多使用Data::Dumper来做一些测试,熟悉Perl内部的数据格式,组织方式;

     待续