免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1090 | 回复: 0
打印 上一主题 下一主题

学习perl总结 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-01-23 09:00 |只看该作者 |倒序浏览
{} 是一个block (块) 执行代码的块。
[] 是一个列表,指向数组。
() 是一个参数列表。
###############################################
$$aaa[0]  ${$aaa}[0]  $aaa->[0]
      $aaa指向数组第一个元素
###############################################
$$aaa{key}  ${$aaa}{key}   $aaa->{key}
      $aaa指向列表第一个元素。
###############################################
${$aaa{key}}  对%aaa散列解引用。
###############################################
注意:$aaa[3] 与 $aaa->[3]是不一样的。
前者讲: @aaa里的第4个元素。
后者讲: 保存在$aaa里数组引用的第四个元素。
@$aaa = (); # 清除@aaa内容。
###############################################
${identifier}; # 和$identifier 一样
${"identifier"}; # 也是$identifier,不过却是一个符号引用。
###############################################
在方括弧或花括弧之间,或者在一个闭方括弧或花括弧与圆括弧之间的箭头是可选的。后者表示间接的函数调用
###############################################
一个伪散列是一个指向数组的任意引用,它的第一个元素是一个指向散列的引用
###############################################
hash 里面没有存它的方法,这完全是 -> 操作符的功劳。-> 操作符其实也没有什么神秘之处,它只不过是调用了一下它右边的那个 sub(注),并且把左边的那个引用变量 unshift 到 sub 的参数列表中去。注:为了正确地找到右边的那个 sub,它还需要把左边的那个引用变量 ref 一下取出原先 bless 进去的那个 tag
###############################################
1,new 的名称不是 Perl 语法的一部分,你完全可以叫 create, construct, build, 或者别的东西。
2,对象也不一定要用 hash 引用来存储数据,事实上任何类型的引用都可以,只不过 hash 引用正好方便表示 OOP 里面的“属性=>值”这种模型而已。事实上,CPAN 上就有一组用数组引用来构造类体系的,更加省空间。
3,Perl 对 OOP 提供的语法很有限,但是支持 OOP 的大多数概念。这些有限的语法包括 bless 函数、package 语句、-> 操作符、还有 @ISA 数组,以及 SUPER UNIVERSAL 等有限的几个关键字。除此以外我想再没有别的东西了。
###############################################
bless 的作用是给第一个参数(必须是个引用)打上一个印记(就好像盖个戳一样),而这个印记就标明了这个引用从此以后应该属于哪个类。理解了这个之后,你就明白 bless $self, $class 和 $class = $self 其实是完全不同的东西。bless $self, $class 之后,$class 还是原来的值,$self 也还是原来的值,只不过 $self 的印记变成了 $class 的内容。$class = $self 则是把 $class 变成和 $self 值相同的一个变量。
###############################################
perl的内置特殊变量:
    $- 当前页可打印的行数,属于Perl格式系统的一部分
  $! 根据上下文内容返回错误号或者错误串
  $” 列表分隔符
  $# 打印数字时默认的数字输出格式
  $$ Perl解释器的进程ID
  $% 当前输出通道的当前页号
  $& 与上个格式匹配的字符串
  $( 当前进程的组ID
  $) 当前进程的有效组ID
  $* 设置1表示处理多行格式.现在多以/s和/m修饰符取代之.
  $, 当前输出字段分隔符
  $. 上次阅读的文件的当前输入行号
  $/ 当前输入记录分隔符,默认情况是新行
  $: 字符设置,此后的字符串将被分开,以填充连续的字段.
  $; 在仿真多维数组时使用的分隔符.
  $? 返回上一个外部命令的状态
  $@ Perl解释器从eval语句返回的错误消息
  $[ 数组中第一个元素的索引号
  $ 当前输出记录的分隔符
  $] Perl解释器的子版本号
  $^ 当前通道最上面的页面输出格式名字
  $^A 打印前用于保存格式化数据的变量
  $^D 调试标志的值
  $^E 在非UNIX环境中的操作系统扩展错误信息
  $^F 最大的文件捆述符数值
  $^H 由编译器激活的语法检查状态
  $^I 内置控制编辑器的值
  $^L 发送到输出通道的走纸换页符
  $^M 备用内存池的大小
  $^O 操作系统名
  $^P 指定当前调试值的内部变量
  $^R 正则表达式块的上次求值结果
  $^S 当前解释器状态
  $^T 从新世纪开始算起,脚步本以秒计算的开始运行的时间
  $^W 警告开关的当前值
  $^X Perl二进制可执行代码的名字
  $_ 默认的输入/输出和格式匹配空间
  $| 控制对当前选择的输出文件句柄的缓冲
  $~ 当前报告格式的名字
  $` 在上个格式匹配信息前的字符串
  $’ 在上个格式匹配信息后的字符串
  $+ 与上个正则表达式搜索格式匹配的最后一个括号
  $ 当前进程的有效用户ID
  $0 包含正在执行的脚本的文件名
  $ARGV 从默认的文件句柄中读取时的当前文件名
  %ENV 环境变量列表
  %INC 通过do或require包含的文件列表
  %SIG 信号列表及其处理方式
  @_ 传给子程序的参数列表
  @ARGV 传给脚本的命令行参数列表
  @INC 在导入模块时需要搜索的目录列表
  $-[0]和$+[0] 代表当前匹配的正则表达式在被匹配的字符串中的起始和终止的位置 。

~~~~~~~~~~~~~perl 编译 exe 工具:perlcc、perlapp、perl2exe、par(
http://par.perl.org
)~~~~~
s///  先做匹配,再做替换,替换在匹配正确之后才生效的。
.*? 不贪多匹配
(aaa)\1 回朔。把aaa放如缓存 代表 aaaaaa.
###########################################################
(?=), look ahead匹配但不吃掉
(?!),下一组文本不match时,才匹配
(?), lood behind, also (?)
$a = "cat housecat catch crazycats";
$a =~ s/(?),使用(…)但不计入反向引用中
(?xims-xims: )
/Answer: ((?i)yes)/; # 'Answer: yes', '…YES', '…Yes', etc
/Answer: ((?-i)yes)/i; # 'answer: yes' only, not "…YES"
(?#)comment, replaced by m/…/x now.
Quote-like operators
?RE? Match only once between reset call.
###########################################################
Define and call an anonymous subroutine
Lvalue subroutine (experimental)
my $subref = sub {$_[0] + $_[1]};
my $add = $subref; # make a copy of subroutine-ref
print &{$add}(1,2), "\t", &$add(1,2), "\t", $add->(1,2);
sub Lsub : lvalue {
my($index)=shift;
$_[$index]; # don't say return $_[$index] here
}
my @a = qw(I my teaching perl.);
$" = " ";
print "@a\n";
Lsub(2, @a) = 'learning'; #函数返回作值,修改为'learning'
print "@a\n"; # @a的值已经被修改
###########################################################
Open a user file
– For read: open(FD, "filename");
– For append: open(FD, ">>filename");
– For pipe read: open(FD, "process |");
– For pipe write: open(FD, "|process");
– +> 截断文件并打开读写+
#############################################################
***last 操作符立即退出当前循环,如果有continue块也不会执行。
***next 操作符忽略当前循环的余下语句然后开始一次新的循环。如果循环里面有continue子句,那么他将就再重新计算条件之前执行,这里continue可以增加循环变量。
LINE: while (){
next LINE if /^#/;
next LINE if /^$/;
...
} continue {
  $count++;
}
***redo 操作符再不重新计算循环条件的情况下重新开始循环语句块,如果存在continue块也不会执行。
last next redo 不单单用于循环,他们可以用于块。
goto LABEL 不能跳进任何需要初始化的构造,比如子过程或者foreach循环。她也不能跳进一个已经优化了的构造
-> 是一个中缀解引用操作符.如果右边是一个[...]数组下标,一个{...}散列下标,或者一个(...)子过程参数列表,那么左边必须是一个对应的数组,散列,或者子过程的应用(硬引用和符号引用都行).在一个左值(可赋值)环境里,如果左边不是一个引用,那么它必须是一个能够保存硬引用的位置.这种情况下,引用会为你自动激活.
..和... 当操作符处于假状态后就不再测试右操作数,和党操作符处于真状态后就不再测试左操作数.
###############################################################
解引用在任何数组或者散列查找之前发生(或者说解引用比数组合散列查找绑定得更紧)
###############################################################
如果试图给一个不是硬引用的数值进行解引用,那么该值会被当作一个符号引用用,也就是说,该引用被解释成一个代表某个全局量的名字的字串。
$aaa == ${aaa} != ${'aaa'} (后面的是符号引用)


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/187/showart_236393.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP