msgbartop
PHP语言, PHP扩展, Zend引擎相关的研究,技术,新闻分享 – 左手代码 右手诗
msgbarbottom

11 Dec 07 Perl的特别之处

     因为项目需要, 要改进一个抓取网页内容的脚本, 用到了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内部的数据格式,组织方式;
     待续


分享到:



Random Posts:

2 Responses to “Perl的特别之处”

  1. perl – 朝闻道 |

    [...] http://www.laruence.com/2007/12/11/122.html [...]

  2. 永涛 |

    用到了来看发现还是有些收获的,支持一下吧~

Leave a Reply

*