- 本文地址: https://www.laruence.com/2007/12/11/122.html
- 转载请注明出处
因为项目需要, 要改进一个抓取网页内容的脚本, 用到了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内部的数据格式,组织方式;
待续
对了注意到上面的11_13, 在perl中,你可以任意对你的数字加上下划线,方便human readable;
在Perl中,所有的IF语句的执行块都要用{}包起来 ,比如如果你习惯了C++语法,写下如下代码 ,..
[…] http://www.laruence.com/2007/12/11/122.html […]
用到了来看发现还是有些收获的,支持一下吧~