var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-333696-1']); _gaq.push(['_trackPageview']); _gaq.push(['_trackPageLoadTime']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })();
  • 2008年11月24日

    Perl学习(2)

    分类:

    Perl的帮助,非windows下用manwindows下用perldoc

     

    perl -e允许Perl在命令行执行Perl语句,后面的命令行在windows下必须用双引号。

     

    $&返回最后一个成功的匹配,$`返回最后成功匹配之前的,$’返回最后成功匹配之后的。

     

    $!存储返回的系统错误,$.是行计数变量。$#返回数组中最后一个元素的下标,$|保证自动清空输出缓存在每行print语句执行之后。

     

    ARGV[0]保存脚本名之后的第一个单词,$0保存Perl脚本名$#ARGV保存数组ARGV中最后那个数的下标。

     

    正则量词(quantifiers)用来匹配字符出现的次数。

    贪婪匹配(greedy):*+,每次尽可能匹配最长字符集;在其后加上?*?可以关掉贪婪匹配,每次仅匹配最小字符集。

    关掉贪婪

    特殊字符(Metacharacter)

    匹配

    x??

    x出现01

    (xyz)??

    样本xyz出现01

    x*?

    x出现0或更多次

    (xyz)*?

    样本xyz出现0或更多次

    x+?

    x出现1或更多次

    (xyz)+?

    样本xyz出现1或更多次

    x{m,n}?

    x至少出现m次但不超过n

    x{m}?

    x出现m

    x{m,}?

    x至少出现m

     

    正则替换(Alternation|)[]中无效,即/a|b|c/等价于[abc]

    正则反向引用(Backreference\1$1)用作将捕获保存,\1仅能用于匹配表达式中,而$1能用于闭块和直到另一个成功搜索。

    正则特殊字符?:关掉捕捉圆括号内的模式,是一个非获取匹配,常同或(|)组合使用。

     

    (反向)预搜索

    特殊字符(Metacharacter)

    匹配

    /PATTERN(?=pattern)/

    正向预搜索

    /PATTERN(?!pattern)/

    正向预搜索

    (?<=pattern)/PATTERN/

    反向预搜索

    (?<!pattern)/PATTERN/

    反向预搜索

    正则正向预搜索是PATTERN 右侧pattern匹配成功则返回PATTERN,而反向预搜索则是PATTERN 左侧pattern匹配成功则返回PATTERN

     

    正则tr用作转换字符,不能翻译正则表达式但能用-(dash),可用y来代替它。

     

    子程序(Subroutines)/函数(Functions)的参数表存放在@_这个本地数组中,@_中的值是实际参数值的隐藏引用,@_数组元素是$_[0],$_[1]$_[2]等等。如果想修改全局拷贝而不是本地@_数组,你可以使用类型标识(typeglobs,符号引用,在变量名前加*符号标识)或者指针(硬引用,在含有引用对象的变量名前加上单反斜杠运算符\)。类型标识是变量别名类似UNIX文件系统中的软链接, 它被Perl用于构建你的程序的符号表,配合local使用;硬引用常被叫作指针,是一个可见标量,它包含其它变量的地址,指针是一个简单标量,可以使用my,要得到指针对应地址的值即解引用,必须在指针名前添加$(因为指针自身是标量),然后在刚添加的符号前添加它所指向的数据类型的符号(对复杂类型,可以用箭头)

     

    当使用引用传值传递一个参数,参数值的拷贝被传进子程序,为在Perl中实现值拷贝,从@_数组拷贝参数并赋给本地变量,Perl使用localmy来创建本地拷贝。local被用于Perl 5发布之前的Perl程序,现在是my操作符,它进一步确保函数块内变量的隐私。local被用于Perl 5发布之前的Perl程序,现在是my操作符,它进一步确保函数块内变量的隐私。local声明的变量是动态作用域,在它被创建的块中和该块内调用的任何函数或者任何嵌套在块内定义的块可见;my声明的变量仅在它们被声明的子程序内可见,而不在被该子程序调用的任何子程序内。use strict能阻止在程序中使用全局变量,只能使用myour内建函数;our变量(Perl 5.6.0+)乔装为语法变量,于是strict编译指示忽略它,它允许你蒙混使用全局变量如果你确实需要;use strict "refs";能让Perl取检查程序中不使用符号引用。

     

    原型(prototype,Perl 5.003+)也被叫作模板,它告诉编译器子程序该获取多少和哪些类型参数当它被调用时:

    sub subroutine_name($$);#两个标量参数

    sub subroutine_name(\@);#一个数组参数

    sub subroutine_name($$;@);#两个标量参数和一个可选数组

     

    wantarray函数根据上下文用来判断到底该子函数应该返回一个列表或者一个标量:

    return wantarray ? @newarray : $newstring;

     

    自动加载(AUTOLOAD)用作查看子程序是否被定义,自动加载子程序当Perl调用子程序但该子程序不能被找着时被调用,这个未定义子程序明被指派给$AUTOLOAD,一般形式为main::未定义函数名(unknown)

     

    BEGINEND子程序,BEGIN子程序在文件其它部分解析前运行,END子程序在程序退出前执行。

     

    use subs允许你预定义子程序明,它的参数是子程序列表,其后调用这些子程序不用在其名前加&或者()

    use subs qw(fun1 fun2 );

     

    $Packagename::该包内变量名,由于main是默认包,于是当切换命名空间不必使用它的名称。

     

    .pm文件叫作模块,模块文件名首字母大写;.pm文件名首字母小写是特殊类型的模块叫作编译指示(pragma),编译指示是一个模块它告诉编译器在运行前Perl程序中的一些条件必须核对,同use搭配使用的就是这个。数组@INC包含Perl库所在的目录,设置PERL5LIB环境变量可以增加新的路径元素。Perl 4时大部分库函数是.pl文件,虽然现在它们大部分被.pm文件所替代。为了包含.pl文件进来,使用require运行时加载文件,类似C#中的include,如果其后没有参数,默认是$_,注意最后一行必须是1(返回真)Perl 4apostrophe(‘)用作切换命名空间。use允许Perl模块(不含非.pm文件)和编译指示在编译时被导入程序,处理usePerl自动调用导入方法。Exporter模块(require Exporter;)实现了导入常规,

     

    没有名的变量或子程序被叫作匿名(anonymous)的,匿名数组元素附在方括号内([]),匿名哈希(hash)靠使用大括号({})创建,匿名数据结构能产生更多复杂类型,匿名子程序靠使用不带子程序名的关键字sub创建。闭包(closure)是一个匿名子程序,它有权限访问my(词汇的)变量即使该变量从它定义的块之外被调用,这样使变量看起来不再在作用域内。

    {   my $name = "Grandfather";  # 词汇变量

        my $age = 86;

        $ref = sub{ return "$name is $age.\n"; }  # 匿名子程序,闭包

    }

        print &{$ref}; # 在块外调用子程序。$ref指针仍然在作用域是因为该引用仍需#要访问它们,perl不会清理调这些变量直至它们不再被引用。

     

    引用传递文件句柄(Filehandle)进子程序,唯一的方法是使用类型标识为该文件句柄创建一个别名,然后使用反斜线(\)去创建对该类型标识的引用:

    #!/bin/perl

    open(README, "/etc/passwd") or die;

    &readit(\*README);     # 引用一个类型标识(typeglob)

    sub readit {

    ...}

    分享到: