由于公司需要用到perl,于是学习了一下(持续更新)
Perl 简介
Perl,一种功能丰富的计算机程序语言,运行在超过100种计算机平台上,适用广泛,从大型机到便携设备,从快速原型创建到大规模可扩展开发。
Perl 语言的应用范围很广,除CGI以外,Perl被用于图形编程、系统管理、网络编程、金融、生物以及其他领域。由于其灵活性,Perl被称为脚本语言中的瑞士军刀。
什么是 Perl?
Perl是由Larry Wall设计的,并由他不断更新和维护的编程语言。
Perl具有高级语言(如C)的强大能力和灵活性。事实上,你将看到,它的许多特性是从C语言中借用来的。
Perl与脚本语言一样,Perl不需要编译器和链接器来运行代码,你要做的只是写出程序并告诉Perl来运行而已。这意味着Perl对于小的编程问题的快速解决方案和为大型事件创建原型来测试潜在的解决方案是十分理想的。
Perl提供脚本语言(如sed和awk)的所有功能,还具有它们所不具备的很多功能。Perl还支持sed到Perl及awk到Perl的翻译器。
简而言之,Perl像C一样强大,像awk、sed等脚本描述语言一样方便。
Perl 优点
- 相比C、Pascal这样的"高级"语言而言,Perl语言直接提供泛型变量、动态数组、Hash表等更加便捷的编程元素。
- Perl具有动态语言的强大灵活的特性,并且还从C/C++、Basic、Pascal等语言中分别借鉴了语法规则,从而提供了许多冗余语法。
- 在统一变量类型和掩盖运算细节方面,Perl做得比其他高级语言(如:Python)更为出色。
- 由于从其他语言大量借鉴了语法,使得从其他编程语言转到Perl语言的程序员可以迅速上手写程序并完成任务,这使得Perl语言是一门容易用的语言。
- Perl 是可扩展的,我们可以通过CPAN("the Comprehensive Perl Archive Network"全面的 Perl 存档网络)中心仓库找到很多我们需要的模块。
- Perl 的 mod_perl 的模块允许 Apache web 服务器使用 Perl 解释器。
Perl 缺点
也正是因为Perl的灵活性和"过度"的冗余语法,也因此获得了仅写(write-only)的"美誉",因为Perl程序可以写得很随意(例如,变量不经声明就可以直接使用),但是可能少写一些字母就会得到意想不到的结果(而不报错),许多Perl程序的代码令人难以阅读,实现相同功能的程序代码长度可以相差十倍百倍,这就令程序的维护者(甚至是编写者)难以维护。
同样的,因为Perl这样随意的特点,可能会导致一些Perl程序员遗忘语法,以至于不得不经常查看Perl手册。
建议的解决方法是在程序里使用use strict;以及use warnings;,并统一代码风格,使用库,而不是自己使用"硬编码"。Perl同样可以将代码书写得像Python或Ruby等语言一样优雅。
很多时候,perl.exe进程会占用很多的内存空间,虽然只是一时,但是感觉不好。
Here 文档
Here文档又称作heredoc、hereis、here-字串或here-脚本,是一种在命令行shell(如sh、csh、ksh、bash、PowerShell和zsh)和程序语言(像Perl、PHP、Python和Ruby)里定义一个字串的方法。
使用概述:
1.必须后接分号,否则编译通不过。
2.END可以用任意其它字符代替,只需保证结束标识与开始标识一致。
3.结束标识必须顶格独自占一行(即必须从行首开始,前后不能衔接任何空白和字符)。
4.开始标识可以不带引号号或带单双引号,不带引号与带双引号效果一致,解释内嵌的变量和转义符号,带单引号则不解释内嵌的变量和转义符号。
5.当内容需要内嵌引号(单引号或双引号)时,不需要加转义符,本身对单双引号转义,此处相当与q和qq的用法。
例子:
#!/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 说明: 如果创建对象的时候使用的是单引号 则 之后的数据不会进行解释
Perl 数据类型
Perl 是一种弱类型语言,所以变量不需要指定类型,Perl 解释器会根据上下文自动选择匹配类型。
Perl 有三个基本的数据类型:标量、数组、哈希。以下是这三种数据类型的说明:
标量
标量是 Perl 语言中最简单的一种数据类型。这种数据类型的变量可以是数字,字符串,浮点数,不作严格的区分。在使用时在变量的名字前面加上一个 $,表示是标量。例如:
$myfirst=123; #数字123 $mysecond="123"; #字符串123
数组
数组变量以字符 @ 开头,索引从 0 开始,如:@arr=(1,2,3)
@arr=(1,2,3)
获取值:$arr[x]
获取最后一个元素的编号 $#;
push(@passengers,\%passenger);
哈希
哈希是一个无序的 key/value 对集合。可以使用键作为下标获取值。哈希变量以字符 % 开头。
如果重复,后者覆盖前者。
多种写法:
- %h=('a',1,'b',2);
- %h=('a'=>1,'b'=>2);
哈希的关键字
- delete
- exists
$data{'facebook'} = 'facebook.com';
所谓上下文:指的是表达式所在的位置。
上下文是由等号左边的变量类型决定的,等号左边是标量,则是标量上下文,等号左边是列表,则是列表上下文。
Perl 解释器会根据上下文来决定变量的类型。实例如下:
#!/usr/bin/perl @names = ('google', 'runoob', 'taobao'); @copy = @names; # 复制数组 $size = @names; # 数组赋值给标量,返回数组元素个数 print "名字为 : @copy\n"; print "名字数为 : $size\n"; 以上程序执行输出结果为: 名字为 : google runoob taobao 名字数为 : 3
多种上下文
序号 上下文及描述
1 | 标量 − 赋值给一个标量变量,在标量上下文的右侧计算 |
2 | 列表 − 赋值给一个数组或哈希,在列表上下文的右侧计算。 |
3 | 布尔 − 布尔上下文是一个简单的表达式计算,查看是否为 true 或 false。 |
4 | Void − 这种上下文不需要关系返回什么值,一般不需要返回值。 |
5 | 插值 − 这种上下文只发生在引号内。 |
不同类型的变量可以用同个名称(符号类型不同)例如 $foo 和 @foo 是两个不同的变量。
引号机制(qq和q)
qq("我是字符串")
q("我是字符串")
上面这种格式几乎跟双引号一模一样,并且并不是一定强制要用 () ,可以用任何的界限字符
Perl 变量
标量 $ 开始, 如$a $b 是两个标量。
数组 @ 开始 , 如 @a @b 是两个数组。
哈希 % 开始 , %a %b 是两个哈希。
Perl变量规则
- 变量名可以包含字母(a至z , A至Z)字符、数字或类型标识符后面的一个下划线字符(_)。不过,变量名的第一个字符不能是数字。
- 变量名是区分大小写字母的。这意味着变量名中的大写和小写字母都是有特定意义的,因此下面这些变量均代表不同的标量变量
- $ value
- $ VALUE
- $ Value
- $ valuE
q运算符对'号转义的方式
$someword = 'i \'ve some money';
可以等价于:
$someword = q~i 've some money~;
qq运算符对"号转义的方式
$someword = "i say \"ok!\".";
可以等价于:
$someword = qq~i say "ok!".~;
qw代表用空格来分隔元素,得到列表
@list = ("perl","Regular","network","web");
可以等价于:
@list = qw(perl Regular network web);
qr代表创建正则
$myword = "catcat";
$replaceword = qr(catcat);
$finalword = "ok" if ($myword =~ $replaceword);
引号执行运算符(quoted execution operator),qx//
q 和 qq 运算符的特点:
※ q 和 qq 必须是一个标识符,而不是标识符的部分。例如:
q (abc) 用 () 作为分界符
q(abc) 用 () 作为分界符
q xabcx 用 x 作为分界符
都是合法的,而
qxabcx 就会被当作是一个标识符来处理,有谁会想到 qxabcx 居然是一个 q 运算式呢?
※ q 和 qq 后面的空格并不会影响语法,但是任何非空字符(不是空格、不是 TAB 字符、
不是换行符)则会被当作界限符来使用。
※ 如果 q 和 qq 使用一些特殊的符号的时候,则必须配对。比如:< 只能和 >; 在一起
用来当作界限符,而不能只用两个 < 作为界限符。而 | 则只能和它自己作为一对界
限符。这些特殊的符号有:()、{}、[]、<>;
perl数组排序(sort)
$a在前面是升序
$b在前面是降序
@testSort=qw(5 7 1 2 4 3); @rTestSort=sort{$a<=>$b} @testSort; print @rTestSort;
perl字符串字符倒序(reverse)
@testSort=qw(5 7 1 2 4 3); @rTestSort2=reverse @testSort; print @rTestSort2;
perl关键字(grep)
grep(XXX{值},array) 它会遍历array,将array的每个值放到xxx{}中去匹配 如果中了就返回, 返回可以接受一个数组。 去重!!!!!!!!!!!!!!!!!!!!!!! my @array = ( 'a', 'b', 'c', 'a', 'd', 1, 2, 5, 1, 5 ); my %count; my @uniq_times = grep { ++$count{ $_ } < 2; } @array;
perl关键字(split)
地址有详细说明 https://blog.csdn.net/hemmingway/article/details/77016448
perl循环
my @arr_countrys_array=split(/\//,$arr_countrys); foreach $arr (@dep_countrys_array) { print "$arr\n"; }