I am LAZY bones? AN ancient AND boring SITE

perl 的特色

由于工作中偶尔要接触一下perl,所以我花了点时间,很粗略地看了一遍flamephoenix的perl中文教程。本文就是我在看的过程中记录下来的点点滴滴,对大家不一定有用,但是也可以让不会perl的同学对其有个直观的印象。perl果然是个非主流,哈哈。

字符串有很不同的转义,可以转义大小写。
$a = "T\LHIS IS A \ESTRING"; # same as "This is a STRING"

比较操作符有“比较”这个操作,整数是 <=> ,字符串是 cmp ,会返回 1,0,-1

字符串能进线自加(++)操作,而且逢zZ9会进位,但是不能自减。

字符串的重复操作符是x(小写字母x),对应的python操作符是 * (星号)

条件操作符可以用来选择变量:
$condvar == 43 ? $var1 : $var2 = 14;

数组变量要有个 @ 头,而且可以和普通变量重名,列表用的是(),对应python里是 []。

列表可以用..表示范围: (2, 5..7, 11) = (2, 5, 6, 7, 11) 更神奇的是,还可以用于实数: (2.1..5.3) = (2.1, 3.1 ,4.1, 5.1) 和字符串 (“aaa”..”aad”) = (“aaa”,”aab”, “aac”, “aad”) ,还可以包含变量: ($var1..$var2+5)

列表赋值给简单变量,会得到列表的长度。。。

打开文件的模式(读、写或追加)是通过在文件名前加前缀指定的,所以,我不知道如果要只读打开文件名是 “>“ 的文件该怎么写。

文件测试操作更像bash的风格。

@ARGV[0] 就是第一个参数,而不是程序名本身。

有个 <> 操作符,可以直接按参数顺序读取指定的文件,这个就得实践过才能体会了。

可以像操作普通文件那样操作管道。而且也是用的open函数。

模式(也就是 正则表达式)操作是内置的,而不用像python那样import re。这点倒是比较像javascript。

有类似 awk 的模式匹配操作符。比如: $result = $var =~ /abc/; 这个用在逻辑判断里很方便。

模式的定界符缺省是/,但是可以用m来自定义。

模式匹配以后可以用 $1 $2 $& 等引用匹配到的组。

模式匹配操作可以放在while里循环,还可以pos定位。

elsif 也比较bash。

有 foreach 的语法。foreach语法里的 循环变量 是 循环内部 的局部变量;在循环里改变循环变量,会修改数组的对应项。。。

last就是break;next就是continue;还有个redo。循环控制很强大。

以上两点,可以用这个小程序体会一下:

#!/usr/bin/env perl
 
@list = (1, 2, 3, 4, 5);
print "@list\n";
foreach $temp (@list) {
	print "temp=$temp\n";
	if($temp==2){
		$temp=20;
		next;
	}
	if($temp==3){
		$temp=30;
		redo;
	}
	if($temp==4){
		$temp=40;
		last;
	}
}
print "@list\n";

也支持goto。

单行条件,也很有特色:语法为statement keyword condexpr。其中keyword可为if、unless、while或until。尤其是短循环时,很方便。

用 sub 来定义子程序,用 &xxx 或者 do xxx 来引用。

实参用括号的传入,(&xxx(1, 2, 3)),形参不列出,在子程序里用 @_ 来引用传入的实参。

局部变量有两种, my($xxx) 的变量自在本子程序内有效。 local($xxx) 的变量在本子程序和下级的子程序内有效。

用变量和数组混合做为参数,传给子程序时,要小心有可能传到 @_ 的时,会被重组。

传参数的时候,也可以传地址,这时候,子程序里改变的变量会影响外部。

perl5里有3个预设的子程序,BEGIN、END、AUTOLOAD,这点又有点像awk。AUTOLOAD 是在找不到子程序的时候被调用。

关联数组,就是用任意变量类型做下标的数组,用 %变量名表示,可以用 foreach $key (keys(%hashlist)) 来遍历。这其实就是python的dict。 不过其 sort keys 不知道是什么语法。。。

%fruit = ("apples",17,"bananas",9,"oranges","none");
和这个等效:
%fruit = ("apples"=>17,"bananas"=>9,"oranges"=>"none");
 
可以先数组,再关联数组:
@fruit = ("apples",17,"bananas",9,"oranges","none");
%fruit = @fruit;
反之亦然:
%fruit = ("grapes",11,"lemons",27);
@fruit = %fruit;
不过@fruit可能变成 ("lemons",27,"grapes",11)

关联数组可以直接赋值增加,用 delete 函数删除。 (“lemons”,27,”grapes”,11)

keys 对应的是 values,可以取出所有的值。

可以用each更好地循环关联数组:
%records = (“Maris”, 61, “Aaron”, 755, “Young”, 511);
while (($holder, $record) = each(%records)) {
# stuff goes here
}

$~ 是个系统变量,用于指定打印格式。

@<<< 左对齐输出 尖尖的个数,就是占的位数。 @>>> 右对齐输出
@||| 中对齐输出
@##.## 固定精度数字
@* 多行文本

select 可以改变缺省文件变量,这样就可以输出内容到文件了。

format 还可以设置页眉。。。

$^是页眉格式,$=是每页行数。还有个当前页的行计数器: $-

设置系统变量$|为非零值,则输出到文件的时候不使用缓冲。

内置了一套完整的文件处理函数,基本上和linux命令是同名的,用法也类似。比如: read/getc/mkdir/readdir/rmdir/rename/link/unlink/chown/stat 等等。

perl和C类似,存在指针,也可以叫“引用”。和C的&取地址符类似的是 \ 地址可以指向所有的类型,包括子程序。

perl也是面向对象的──类是一个Perl包,其中含提供对象方法的类。方法是一个Perl子程序,类名是其第一个参数。对象是对类中数据项的引用。

与包的引用结合,可以用单引号(‘)操作符来定位类中的变量,类中成员的定位形式如:$class’$member。在Perl5中,可用双冒号替代单引号来获得引用,如:$class’$member与$class::$member相同。

一个perl程序可以用package切分成很多个“包”,各包之间有独立的命名空间,而且程序可以随时在包之间来回切换。

perl里有两个和python的import类似的语法,require和use,require更像C的宏替换,use更像import。然后和 sys.path 类似的数组叫 @INC。

还有 cpan 很强大~

最后修改时间: 2010年07月25日 15:24

本文章发表于: 2010年07月25日 15:24 | 所属分类:流水帐. | 您可以在此订阅本文章的所有评论. | 您也可以发表评论, 或从您的网站trackback.

15 个评论 关于: “perl 的特色”

  1. Tweets that mention I am LAZY bones ? : perl 的特色 -- Topsy.com 在 2010年07月25日 15:41 说:回复

    […] This post was mentioned on Twitter by 骨头, perl ism. perl ism said: RT !bones7456: li2z新文章: perl 的特色 ( https://luy.li/2010/07/25/special-perl/ ) […]

  2. wd 在 2010年07月25日 19:13 说:回复

    sort keys %xxx 先用 keys %xxx 把那里面的值取出来,结果是个数组,然后 sort 这个数组。

    写程序的时候 use strict; use warnings; 可以避免很多问题。

    perldoc 命令可以看一些 help,perldoc -f push, perldoc perlvar, perldoc XML::Parser

    • bones7456 在 2010年07月26日 08:41 说:回复

      看来perl里的函数还可以作为操作符来用,不用括号也行,哈哈。
      perldoc很有用哦~

  3. 大尾鱼 在 2010年07月25日 20:47 说:回复

    perl是很强大的,尤其是处理一些文本啥的。。

  4. banban 在 2010年07月26日 00:00 说:回复

    恩 刚开始用 perl 的时候 有一点不太习惯的 就是要在变量前面加 一个 $ 或者 @ 符…… 不过 perl 的正则表达式很强悍的说 呵呵 当时偶是看那本骆驼书学的 嘻嘻 *^_^*

  5. 丕子 在 2010年07月26日 06:41 说:回复

    所以说用的人多 也是有原因的

  6. nomyself 在 2010年07月26日 08:00 说:回复

    没有说到perl的上下文的概念……..

    • bones7456 在 2010年07月26日 08:43 说:回复

      你说的上下文,就是select或者是package只影响后面的内容这个特性吧?这确实也是一大特色,呵呵。

      • nomyself 在 2010年07月26日 08:56 说:回复

        比如说函数 test 返回的是列表。 $result = &test 和 @result = &test , 上下文弄错了,结果就不同了..

  7. mono 在 2010年07月26日 09:55 说:回复

    (2.1..5.3)真的能返回那个么..我记得骆驼书上说会先取整的,codepad测试也是
    print (2.1..6.3) -> 23456

    quote:
    打开文件的模式(读、写或追加)是通过在文件名前加前缀指定的,所以,我不知道如果要只读打开文件名是 “>“ 的文件该怎么写。
    my ans:
    open ‘MYFILE’,’filename’也许可以,perl5+
    perldocs:
    * open FILEHANDLE,EXPR

    * open FILEHANDLE,MODE,EXPR
    * open FILEHANDLE,MODE,EXPR,LIST
    * open FILEHANDLE,MODE,REFERENCE
    * open FILEHANDLE

    quote:
    不过其 sort keys 不知道是什么语法。。。
    my ans:
    sort keys %hash 是sort(keys(%hash))的简略,返回排序后的keys

    • mono 在 2010年07月26日 10:55 说:回复

      啊。。blog程序把尖括号吃了 orz

  8. xiooli 在 2010年07月27日 16:29 说:回复

    有天书,大家快来围观^^

  9. tusooa 在 2010年07月27日 20:37 说:回复

    wd:use warnings;
    直接#!/usr/bin/perl -w
    不就行了。
    不知道为什么#!/usr/bin/env perl -w,env会报错。
    =>前面不用加引号。

    • bones7456 在 2010年07月28日 16:00 说:回复

      嗯,有引号也可以。

    • xeme51 在 2010年09月23日 23:05 说:回复

      还是用这个的好,Windows也可以用perl的呀

发表评论