Perl学习笔记
1.单引号和双引号
#!/usr/bin/perl print "Hello, world\n"; # 双引号 print 'Hello, world\n'; # 单引号
结果:
Hello, world
Hello, world\n
也就是可以看出,双引号会解析 转义字符和变量,而单引号不会。
2.字符串(Here文档)
#!/usr/bin/perl $a = 10; $var = <<"EOF"; 这是一个 Here 文档实例,使用双引号。 可以在这输如字符串和变量。 例如:a = $a EOF print "$var\n"; $var = <<'EOF'; 这是一个 Here 文档实例,使用单引号。 例如:a = $a EOF print "$var\n";
输出:
这是一个 Here 文档实例,使用双引号。 可以在这输如字符串和变量。 例如:a = 10 这是一个 Here 文档实例,使用单引号。 例如:a = $a
1.$a用来定义标量,
2.在定义字符串时,要使用一个EOF或者其他任何样式的字母,并且加上<<,最后一行结束时还要有同样的字串作为结束,并且如果是双引号,就会解析其中的变量,单引号不解析变量。
3.数据类型
Perl是弱类型的语言,变量不需要指定类型。
1.标量:可以是数字、字符串、浮点数:$myfirst=123; #数字123
2.数组:以0开头,@arr=(1,2,3)
3.哈希:%h=('a'=>1,'b'=>2); 无序的key/value集,以%开头。
4.变量上下文
#!/usr/bin/perl @names = ('google', 'runoob', 'taobao'); @copy = @names; # 复制数组 $size = @names; # 数组赋值给标量,返回数组元素个数 print "名字为 : @copy\n"; print "名字数为 : $size\n";
输出:
名字为 : google runoob taobao 名字数为 : 3
上下文是由表达式左边的变量类型决定的,=左边是标量/列表,则是标量/列表上下文,
5.特殊字符
#!/usr/bin/perl print "文件名 ". __FILE__ . "\n"; print "行号 " . __LINE__ ."\n"; print "包名 " . __PACKAGE__ ."\n"; # 无法解析 print "__FILE__ __LINE__ __PACKAGE__\n";
结果:
文件名 E:/MymyEclipse_workSpace/Test002/perl.pl 行号 3 包名 main __FILE__ __LINE__ __PACKAGE__
其中分别是指文件名、行号、包名。这些特殊字符不能出现在字符串中。
6.建立和访问数组
@array=(1,2,3); $array[0]=9; print "$array[0]";
建立就是很正常地建立,访问使用$+元素位置就可以了,和python一样,-1表示最后一个,并且-2以此类推。
#!/usr/bin/perl @var_10 = (1..10); @var_20 = (10..20); @var_abc = (a..z); print "@var_10\n"; # 输出 1 到 10 print "@var_20\n"; # 输出 10 到 20 print "@var_abc\n"; # 输出 a 到 z
提供了:起始值..结束值 来创建数组,和SNL挺像啊。
数组大小可以由 标量上下文决定。
7.对数组的操作
#!/usr/bin/perl # 创建一个简单是数组 @sites = ("google","runoob","taobao"); print "1. \@sites = @sites\n"; # 在数组结尾添加一个元素 push(@sites, "baidu"); print "2. \@sites = @sites\n"; # 在数组开头添加一个元素 unshift(@sites, "weibo"); print "3. \@sites = @sites\n"; # 删除数组末尾的元素 pop(@sites); print "4. \@sites = @sites\n"; # 移除数组开头的元素 shift(@sites); print "5. \@sites = @sites\n";
这个例子很不错了,清晰明了。首先是对数组的输出是最基本的,直接输出定义就可以。
push(@数组名,“添加元素”)/unshift(@数组名,“添加元素”)/pop(@数组名)/shift(@数组名)
#!/usr/bin/perl @sites = qw/google taobao runoob weibo qq facebook 网易/; @sites2 = @sites[3,4,5]; print "@sites2\n";
这个例子给出了创建数组的另一种方法,就是使用qw然后是/元素1 元素2 /; 元素之间使用空格隔开。
对元素进行分割,切割后赋值给一个新的数组,当然也可以使用像创建数组时的 ..,来表示一个范围。
#!/usr/bin/perl @nums = (1..20); print "替换前 - @nums\n"; splice(@nums, 5, 5, 21..25); print "替换后 - @nums\n";
结果:
替换前 - 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 替换后 - 1 2 3 4 5 21 22 23 24 25 11 12 13 14 15 16 17 18 19 20
对数组元素进行替换使用splice函数,其中参数分别是就是@数组名、替换起始下标,替换元素个数,替换为的序列。
例子中就是从下标为5,的5个数分别替换为21-25.
#!/usr/bin/perl # 定义字符串 $var_test = "runoob"; $var_string = "www-runoob-com"; $var_names = "google,taobao,runoob,weibo"; # 字符串转为数组 @test = split('', $var_test); @string = split('-', $var_string); @names = split(',', $var_names); print "$test[3]\n"; # 输出 o print "$string[2]\n"; # 输出 com print "$names[3]\n"; # 输出 weibo
这个演示的就是如何将字符串转换为数组,使用split函数,第一个参数是分隔符,第二个就是$字符串。
那么如何将数组转换为字符串呢?使用join函数即可,参数是类似的,第二个参数是@字符串。
#!/usr/bin/perl # 定义字符串 $var_string = "www-runoob-com"; $var_names = "google,taobao,runoob,weibo"; # 字符串转为数组 @string = split('-', $var_string); @names = split(',', $var_names); # 数组转为字符串 $string1 = join( '-', @string ); $string2 = join( ',', @names ); print "$string1\n"; print "$string2\n";
#!/usr/bin/perl # 定义数组 @sites = qw(google taobao runoob facebook); print "排序前: @sites\n"; # 对数组进行排序 @sites = sort(@sites); print "排序后: @sites\n";
使用sort函数进行对数组的排序,是根据ascii值来排序的,所以大小写对其是有影响的。
#!/usr/bin/perl @odd = (1,3,5); @even = (2, 4, 6); @numbers = (@odd, @even); print "numbers = @numbers\n";
可以合并数组,在参数里放2个数组即可。
#!/usr/bin/perl @list = (5,4,3,2,1)[1..3]; print "list 的值 = @list\n";
在建立数组的时候,可以在后面加上一个范围,表示读取指定范围的元素:
list 的值 = 4 3 2
//感觉这个功能可以的,有点奇怪。
8.创建哈希的3种方法
#!/usr/bin/perl %data = ('google', 'google.com', 'runoob', 'runoob.com', 'taobao', 'taobao.com'); %data1 = ('google'=>'google.com', 'runoob'=>'runoob.com', 'taobao'=>'taobao.com'); %data2 = (-google=>'google.com', -runoob=>'runoob.com', -taobao=>'taobao.com'); print "$data{'google'}\n"; print "$data1{'runoob'}\n"; print "$data2{-google}\n";
1.直接是第一个元素是key,第二个元素是value。这是默认的。
2.使用=>来确定key和value。
3.使用-和=>来确定key和value,这种key是不能有空格的。
4.注意print没有括号,还有访问hash元素不是[]而是{}!!!而且只能使用key来访问,//这个好像在语言里都是通过这个访问的。
#!/uer/bin/perl %data = (-taobao => 45, -google => 30, -runoob => 40); @array = @data{-taobao, -runoob}; print "Array : @array\n";
读取哈希值到数组,使用@哈希数组名{key1,key2}这样子。
#!/usr/bin/perl %data = ('google'=>'google.com', 'runoob'=>'runoob.com', 'taobao'=>'taobao.com'); @names = keys %data; print "$names[0]\n"; print "$names[1]\n"; print "$names[2]\n";
使用keys %哈希名,可以获取哈希数组中所有的关键字!并且存到一个数组里!厉害了!
那么同样的道理,获取所有的value,就是values %哈希数组名了。
#!/usr/bin/perl %data = ('google'=>'google.com', 'runoob'=>'runoob.com', 'taobao'=>'taobao.com'); if( exists($data{'facebook'} ) ){ print "facebook 的网址为 $data{'facebook'} \n"; } else { print "facebook 键不存在\n"; }
判断某一元素是否存在,使用exists函数($data{'测试值'}),
#!/usr/bin/perl %data = ('google'=>'google.com', 'runoob'=>'runoob.com', 'taobao'=>'taobao.com'); @keys = keys %data; $size = @keys; print "1 - 哈希大小: $size\n"; @values = values %data; $size = @values; print "2 - 哈希大小: $size\n";
如何获取哈希数组的大小呢?通过获取keys或者values即可。
根据上下文来获取keys数组的大小,还是比较简单的。
#!/usr/bin/perl $data{'facebook'} = 'facebook.com'; # 删除哈希中的元素 delete $data{'taobao'};
向哈希中添加元素直接添加就可以了,好像所有的编程语言都是这样的;删除哈希中的元素,使用delete $哈希数组名{'关键字'}。
9.