perl学习笔记

来源:互联网 发布:ubuntu terminal 配色 编辑:程序博客网 时间:2024/05/24 03:12

1.在单引号里,\n不是换行,只是反斜线和字母n两个字符

2.2**3表示2的三次方

3.<STDIN>让perl程序读取从键盘输入的值

4.<STDIN>返回的字符串,一般都会在最后跟有一个换行符,用chomp能移除换行符,举例:

#!/usr/bin/perl
chomp($c=<STDIN>);
if($c eq "a"){
    print"match\n";
}
else{
    print "nodata\n";
}

如果不加chomp,当你输入"a"的时候输出"no data"

5.注意下面不是乘号,而是字母x,输出为"hellohello"

#!/usr/bin/perl
$c="hello"x2;
 print "$c\n";

6.  ..范围操作符,从左边的数字计数到右边,每次加1,@是声明数组

c[0]=5,c[1]=6等等,pop可用来取出数组最一个元素,同时返回该元素值

下面输出$a=9,$b=8,@c为“5 6 7”

#!/usr/bin/perl
@c=5..9;
$a=pop(@c);
$b=pop(@c);
    print "$a$b\n@c\n";
7.perl的pop跟push操作数组的最右边,shift跟unshift操作数组的最左边
#!/usr/bin/perl -w

  1. use strict;
  2. print '@a @b @c @d 的值都为12 3',"\n";
  3. my @a =(1..3);
  4. pop(@a);
  5. print "\@a的值为@a,pop拿掉数组最右边的值\n";
  6. my @b =(1..3);
  7. push(@b,'4');
  8. print "\@b的值为@b,push添加一个值到数组的最右边。\n";
  9. my @c =(1..3);
  10. shift@c;
  11. print "\@c的值为@c,shift拿掉数组最左边的一个值。\n";
  12. my @d =(1..3);
  13. unshift(@d,0);
  14. print "\@d的值为@d,unshift添加一个值到数组的最左边。\n";
  15.  
  16.  
  17. [root@OTRS perl]# perlpop_push_shift_unshift.pl
  18. @a @b @c@d 的值都为12 3
  19. @a的值为1 2,pop拿掉数组最右边的值
  20. @b的值为1 2 34,push添加一个值到数组的最右边。
  21. @c的值为2 3,shift拿掉数组最左边的一个值。
  22. @d的值为0 1 23,unshift添加一个值到数组的最左边。

8.Foreach从列表(数组)的第一个元素一直循环执行到最后一个元素,一次迭代一个。控制变量(本例中为$rock)每一次迭代从列表中取出一个新值。第一次为“ bedrock” ,第三次为 “ lava”。控制变量不是这些列表元素中的一个拷贝而是这些元素本身。也就是说,如果在循环中修改这个变量,那原始列表中的元素也会被修改,如下面代码段所显示。这条性质是有用的,但是,如果不清楚,可能对其结果感到吃惊。
当循环结束时$rock 的值为多少呢?其值同循环开始之前相同。foreach 循环中控制变量的值会被 Perl自动保存和恢复。当循环进行时,是没有办法改变其值的。循环结束时,变量的值会回到循环开始前,如果没有值则为undef。这意味着如果有一个变量和控制变量有相同的名字:“ $rock” ,不用担心会混淆它们。

#!/usr/bin/perl
foreach $rock(qw/bedrock slate lava/){
print "One rock is $rock.\n";
}

$rock = "black rock";

@rocks=qw/bedrock slate lava/;
foreach$rock(@rocks){
$rock = "test $rock";
$rock .= "\n";
}
print "The rocks are:\n",@rocks;
print "The rock is: $rock\n";


 Output
One rock is bedrock.
One rock is slate.
One rock is lava.
The rocks are:
test bedrock
test slate
test lava
The rock is: black rock

9.reverse会读取数组并按相反的次序返回,会输出“109876”

@array=6..10;
@a2=reverse(@array);
$rock = "teset";

print @a2;

10.使用qw可以不用输入大量的引号,sort用来排序,输出apple first hit,$c=45

#!/usr/bin/perl
@a1=qw(first applehit);
@a2=sort @a1;
foreach(@a2){
print "$_\n";
}
$c=42+@a1;
print "$c\n";

11.匹配不分大小写

#!/usr/bin/perl
while(<>){
if(/fred/i){  #Fred、FRED等都匹配
print "match";
}
}

12.Perl中的一个非常有用的函数是split -把字符串进行分割并把分割后的结果放入数组中。这个函数使用规则表达式(RE),如果未特定则工作在$_变量上。

split函数可以这样使用:

$info = "Caine:Michael:Actor:14, Leafy Drive";
@personal = split(/:/, $info);

其结果是:
@personal = ("Caine", "Michael", "Actor", "14, Leafy Drive");

如果我们已经把信息存放在$_变量中,那么可以这样:

@personal = split(/:/);

如果各个域被任何数量的冒号分隔,可以用RE代码进行分割:

$_ = "Capes:Geoff::Shot putter:::Big Avenue";
@personal = split(/:+/);

其结果是

@personal = ("Capes", "Geoff", "Shot putter", "Big Avenue");

但是下面的代码:

$_ = "Capes:Geoff::Shot putter:::Big Avenue";
@personal = split(/:/);

的结果是

@personal = ("Capes", "Geoff", "", "Shot putter", "", "", "BigAvenue");


13.sub可创建子程序,让我们可以重复利用已有的代码,可以通过“&”来调用子程序,最后一次的运算结果都会被自动当成子程序的返回值(不同于VBS),第2个例子最后的表达式为print语句。它的返回值通常是1,代表“输出成功”,但它并不是我们想要的值。

example 1:

sub test {

   $a + $b;

}

$a = 3;

$b = 4;

$tmp1 = &test; #tmp为7

example 2:

sub test{

   $a + $b;

   print "hello\n";

}

$a = 3;

$b = 4;

$tmp1 = &test; #tmp为1

14.my可以用来创建私有变量,state可以创建持久性私有变量(在子程序多次调用保留该变量的值)

sub max {

   my($m,$n);

   ($m,$n)=@_;

   if($m>$n) {$m} else{$n}

}

15.反向引用\1,反斜号后的数字和括号的组号匹配

$_ = "abba";

if (/(.)\1/){ #同'bb'匹配

   print "Matched!";

通过使用\g{1}排除二义性

use 5.010;

$_ = "aa11bb";

if (/(.)\g{1}11/){ #同'aa11'匹配

   print "Matched!";

16.默认模式匹配的对象是$_,=~能让perl拿右边的模式来匹配左边的字符串,而非匹配$_

my $t = "my rubble";

if($t=~/\brub/){ #\b匹配单词边界,还能匹配rubtest,但不能匹配arub

   print "match!";

}

17.s///用来替换

$_= "he is go with Barneytonight!";

s/Barney/Fred/;

print "$_";


18.即使有其他可以替换的部分,s///也只会进行一次替换,用/g进行全局替换

$_ = "home,sweet home!";

s/home/cave/g;

print "$_"; #打印"cave,sweetcave!",若不加/g,则打印"cave,sweet home!"


19.

$x="4:6:8:10";

my @values = split /:/,$x; #得到4,6,8,10

my $z = join "-",@values; #得到4-6-8-10

print "$z";

20.在编写perl程序的时候,我们有时需要截取一个字符串中的部分内容,这个时候通常会使用Perlsubstr函数实现这个功能。

1.            $str="testtest";  

2.            print substr($str,0,5);  

运行上面的程序,输出结果"testt",这个是我们想要的结果。再看看下面的程序:
  

1.            $str="测试文本";  

2.            print substr($str,0,1); 

这时候输出了一个"?",这显然不是我们想要的结果。因为在perl中,所有从外部输入的字符串(包括写在程序里的字符串)都会当成字节来处理,"printsubstr($str,0,1);"这句话只是把"测试文本"的第一个字节取出来,并且用print输出,然而单个字节是不能表示一个中文字符的,所以就输出了"?"。

如果想要上面的程序输出正确的结果,就需要使用decode函数把"测试文本"转换成perl内部字符串,让perl把"测试文本"当成字符串来处理,这样再用"substr($str,0,1);"截取的就不是一个字节,而是一个汉字。

◆下面看一下Perl substr函数的用法:

指令:substr

语法:substr($string,offset,length)
offset代表起始字符的位置,length代表引用的字符串长度,如果省略length则代表从起始值到字符串的最后一个字符长度。而offset如果是负值的话,就会从字符串右边开始指定字符。
示例:
 

1.            $s=substr("perl5",2,2);#这时$s="rl";  

2.            $s=substr("perl5",2);#这时$s="rl5";  

3.            $s=substr("perl5",-2,2);#这时$s="l5"; 

----------------------------------------

21.chdir 功能为改变当前工作目录(同cd),用法如下:

chdir("$Path/$day");

22.