学习perl总结

{} 是个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’} (后面的是符号引用)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值