perl学习笔记

以下纯属个人学习总结,如有问题或疑问请指出

perl语言学习总结:
1.获取用户输入
$line = <STDIN>;
if($line eq "\n"){
 print "你按下了回车";
}else{
 print "你没有按下回车";
}

2.去除换行符
$text = "a line of text\n";
chomp($text);

3.while控制结构
$count = 0;
while($count<10){
$count += 2;
print "count is now $count\n";# 2 4 6 8 10
}

4.如何定义一个数组以及怎么访问数组中的元素
@fred = ("11","22","33","44","55");
print $fred[0];#控制台打印11
$count = 0 ;
while($count<$#fred+1){#  $#fred 获取数组的索引 
 print "$fred[$count],";//#  控制台打印 11,22,33,44,
 $count++;
}

5.列表直接量
("11","22","33","44");

6.pop和push操作符
pop 获取数组中的最后一个元素
@array = 5..9;
$fred = pop(@array);# 在控制台打印的是9
push 添加一个元素(或是一串元素)到数组的尾端
push(@array , 0); # @array 现在是5,6,7,8,9,0

7.shift和unshift操作符,shift与unshift操作符是对数组的"开头"或"结尾"进行相应的操作
@array = qw# hello word #;
$m = shift(@array); # $m 变成"hello",@array 现在是("word")
unshift(@array,"hello"); # @array 现在是("hello","word")

8.字符串的数组内插
@rocks = qw{hello word};
print "my first @rocks";
9.foreach 控制结构
foreach $example (qw/ hello word /){
 print "$example\n";
}

10.perl 中的$_ 使用  术语:perl的 老地方
foreach(1..10){
 print "$_";
}

11.reverse 操作符, 该操作符会读取列表的值(可能来自数组),并按相反的次序返回该列表
@array = 1..5;
print reverse(@array);

12.sort 操作符的使用,将数组进行相应的排序
@array = ("dd","aa","cc","bb");
print sort(@array); # 控制台输出 aa bb cc dd

13.标题上下文与列表上下文
@array = ("aa","bb","cc");
@list = @array;
print @list; # 控制台输出 aa bb cc 列表赋值
$n = 1+@array;
print $n; # 控制台输出4  标量赋值

14.强制指定标量上下文
@rocks = qw(hello word);
print @rocks;
print scalar(@rocks);

15.子程序(就象java中的方法)
#创建
sub xx(){
 $_[0]+$_[1];
}
#调用
$number = &xx(1,2);
print $number; # 控制台输出3

16.子程序中的私有变量
sub max(){
 my($m,$n) = @_;# 将保存在@_中的参数赋值给具体的变量
 if($m>$n){
  $m
 }else{
  $n  
 }
}

17.长度可变的参数列表
sub max(){
 if(@_ != 2){
  print "你传入的参数个数不正确!";
 }
 my($m,$n) = @_;# 将保存在@_中的参数赋值给具体的变量
 if($m>$n){
  $m
 }else{
  $n  
 }
}

18.更好的&max 子程序,可以让它能接受任意数目的参数
sub max(){
 my($max_so_far) = shift(@_);# 数组中的第一个值,暂时把它当成最大值
 foreach(@_){# 遍历数组 @_中的其他元素
  if($_ > $max_so_far){# 看看是否当前的元素比$max_so_far大?
   $max_so_far = $_; 
  }
 }
 $max_so_far;
}
#上面的程序使用了"高水线"的算法
print max(1,6,21,32);# 32

19.关于词法(my) 变量
my $aa,$bb;# $bb 没有声名
my($aa,$bb);# 正确
my @cc # 也可以声名私有数组

20. use strict
个人感觉没有什么太大用途

21.return 的使用
my @names = ("aa","bb","cc","dd","ee");
my $value = &which_element_is("cc",@names);
print $value;

sub which_element_is{
 my($what,@list)=@_;
 foreach(0..$#list){
  if($what eq @list[$_]){
   return $_;
  }
 }
 -1;# 这里也可以写成-1
}

 

其他控制结构
1.unless控制结构:他与if中的条件刚好相反if(true){....} unless(false){....}
2.Until 控制结构:他与while中的条件刚好相反while(true){....} Until(false){.....}
3.条件修饰词:print "$n is a negative number.\n" if $n < 0 相当于if($n < 0){print "$n is a negative number.\n"}
4.last操作符,相当于java中的break
5.next操作符,相当于java中的continue
6.redo操作符,它能将控制返回到本次环的顶端,不经过任何条件测试,也不会进入下一次循环迭代

哈唏  {} 哈唏必须以花括号进行处理
1. $hash{"xx"} = "xxx";# 给xx这个哈唏进行赋值
print $hash{"xx"};# 输出xxx
2. %hash=("a"=>1,"b"=>2,"c"=>3);#这是一个哈唏列表,a,b,c 都是key ,而1,2,3则是值
print %hash;#输出a1b2c3.这里的输出不一定是这种顺序的,因为哈唏出来的值是无序的
3. keys 和 values 函数
my %hash = ("a"=>1,"b"=>2,"c"=>3);
my @key = keys(%hash);# 输出abc
my @value = values(%hash);# 输出123
print @key , @value;
4.each函数 罗列哈唏的每个键/值对
while(($key , $value) = each %hash){
 print "$key => $value\n";
}
5.exists函数  检查哈希中是否有某个键
if(exists $hash{"a"}){
 print "这个hash中有这个键";
}

6.delete 函数 从哈希中删除指定的键及其相对应的值,假如没有这个键  也不会出现任何警告或错误信息
delete $hash{"a"};

正则表达式:正则表达式,在perl中常常叫做模式,是一个匹配某字符串的模板
1. $_ = "hello world";
if(/llo/){#查看llo在整个标量中是否存在
 print "";
}

2.关于元字符
点号 .   /wyl.xx/ # 说明wyl 任意字符(必须是一个字符) xx
星号(量词) * /wyl*xx/ # 说明wyl 任意字符(可以有任意多个字符) xx
点星.*  捡破烂模式
加号(量词) + /wyl +xx/ # 说明wyl 空格(必须要有一个的空格才行?) xx  如果是wylxx 这样不满足条件的
问号(量词) ? /wyl?xx/ # 之间也可以有字符也可以没有字符
圆括号 () /(wyl)+/ # 他会匹配wylwylwyl这种字符串
\1 \2 \3 反向引用  $_ = "abba";if(/a(.)\1/){print "true";}#输出true
或符号 | 择一匹配  $_ = "wyl and wxs"; if(/wyl and|or wxs/){print "true";}#输出true

字符集 是指一串可能出现的字符集合,通过写在方括号[]内来表示.它只匹配单个字符,但可以是字符集里列出的任何一个.
第一个经典的字符集  [a-zA-Z] :这个字符集可以匹配52个字母中的任何一个
[abcwxyz] 会匹配这7个字符中的任何一个。
脱字符 (^)   [^abc] 会匹配这三个字符(包含这三个字符)以外的任何字符. [^n\-z] 则匹配n 、连字符与z以外的任何字符

字符集简写
[0-9] 可以简写成\d
[A-Za-z0-9_] 可以简写成\w
\s 简写擅长处理空白,它相当于[\f\t\n\r]  比较常见的做法是使用\s*来匹配任意数目的空白(也包括零个空白),或用\s+来匹配一个以上的空白字符
\h 简写能匹配横向空白,其实就是一个包含制表符和空格的字符集[\t ]
\v 这个简写用来匹配纵向的空格,其实也就是写[\f\n\r]的快捷方式
\r 简写能匹配任何类型的断行,这给跨操作系统的断行匹配带来了便利,因为\r知道各种风格的断行方式.

[\d\D] 表示任何数字或非数字


以正则表达式进行匹配
1. 以m//进行匹配
m// 就是前面的/xxx/ 的简写。向 / / 符号就是定界符. 还有其它的如:m(xxx),m<xxx>,m{xxx},m[xxx] 等等
这里有个简写:如果你选择双斜线作为定界符,那么你可以省略开头的m。因为perl程序员们喜欢省略多余的字符,所以大部分的模式匹配都会以双斜线来编写,就象/xxx/这样。
常见的定界符是花括号。在程序员专用的编辑器里,可能会具有从左花括号跳到相应右花括号的功能,这在维护上有很大的帮助。

2.可选修饰符
定义:这是一些可有可无的修饰字符,有时候称为开头。它们可以成组附加在某个正则表达式结尾的定界符的右边,并改变正则表达式的默认行为。
用/i 来进行大小写无关的匹配
chomp($_=<STDIN>);
if(/yes/i){
 print "true";#  如果你输入YES,控制台也会打印true
}

用/s来匹配任意字符
$_="how are you\nwang yl";
if(/are.*yl/s){
 print "yes true";# 控制台会打印yes true
}

用/x加入空白
这个修饰符能够在模式里面随意加上空白,目的是使它更容易阅读、理解。
/-?\d+\.?\d*/ # 都挤在一起,很难看清是什么意思
/ -? \d+ \.? \d* /x # 加入空白后,稍微清楚些

组合选项修饰符
如果在一个模式中使用多个修饰符,可将它们连在一起使用。它们之间的先后顺序并不会影响匹配的结果:
if(/xx/is){# 同时使用 /i 和 /s
}

# 可以进行注释
$_="how are you\nwang yl";
if(
 m{
  are # 这是一个数量词
  .* # 之间的任何东西
  yl # 随便写的
 }sx #匹配任意字符
){
 print "yes true";
}

锚位
锚位:默认情况下,模式匹配的过程开始于待匹配字符串的开头,如果不相符就往字符串后面浮动,看其它位置能否匹配。但是加入一些锚位,可以让模式直接匹配字符串的某处。

^ 脱字符 是一个锚位 用来标示字符串的开头,
$ 也是一个锚位,用来标示字符串的结尾

单词锚位
锚位并不局限于字符串的首尾。比如\b是单词边界锚位,它匹配任何单词的首尾。
/\bwangyl\b/  它只能匹配 wangyl     而不能匹配wangylhowareyou
这里所说的单词并不是一般的英文单词,而是由一组\w字符构成的字符集,也就是由普通英文字母、数字与下划线组成的单词。\b 锚位匹配的是一组\w字符的开头或结尾。
单词边界锚位非常有用,它保证我们不会意外地在delicatessen中找cat、在boondoggle中找到dog或在selfishness中找到fish。有时候、你只会用到一个单词边界锚位、像用/\b/来匹配hunt、hunting或hunter,而排除了shunt;或是用/stone\b/ 来匹配standstone事flintstone,但不包括capstones。

非单词边界锚位是\B,它能匹配所有\b不能匹配的位置。
因此,模式/\bsearch\B/会匹配searches、searching与searched,但不匹配search或researching。

绑定操作符
默认的情况下模式匹配的对象$_,绑定操作符=~ 则能让perl拿右边的模式来匹配左边的字符串,而非匹配$_。相当于java中的==  equal()
实例:
my $some_other = "hello wangyl , how are you.";
if($some_other =~ /\byo/){
 print "true";#控制台输出true;因为$some_other 中包含yo
}

模式串中的内插

 $what = "sky";
while(<>){
 if(/^($what)/){
  print "$what of $_";#当输入sky  则在控制台输出sky of sky
 }
}

捕获变量  看的我有点头晕

字符串操作与排序
用index进行搜索字符串
my $stuff = "hello world!";
my $where = index($stuff,"word");#控制台输出6
my $where = index($stuff,"word",2);# 这里的2的意思是从第二个字符开始搜索,这样会提高搜索效率。

用rindex进行匹配最后一次出现一个字符的位置
my $stuff = "hello world!";
my $where = rindex($stuff,"d");#输出10
my $where = rindex($stuff,"d",2);# 这里的2的意思是从第二个字符开始搜索,这样会提高搜索效率。

用substr处理子串
语法:
$part = substr($string,$initial_position,$length);
它需要三个参数:一个字符串、一个从零起算的起始位置(类似index的返回值)以及子串的长度。找到的子串会被返回。
my $xx = substr("hello wangyl",6,5);#wangy
my $xx = substr("hello wangyl",6);#wangyl
my $xx = substr("hello wangyl",6,50000);#wangyl

my $xx = substr("hello wangyl",-3,2);#gy
my $xx = substr("hello wangyl",-3,2000);#gyl

sprintf 进行相应的格式化
my $money = sprintf "%.2f", 2.49997;#2.50

目标操作


2011 2 3 过年,过年的时候我就要结婚了,恭喜我吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值