Perl初学笔记

标量数据
标量:数字和字符串。
数字:Perl不存在整形,全部是double类型。整形常量会被自动转换为浮点型。
Perl数字字面量(直接量):+-和小数点是非必须的,e代表10的多少次方。例如:-1.2e15,12_999.。2进制已0b开头,8进制已0开头,十六进制已0x开头,非十进制的字面量超过4个字符可以使用_区分,例如:0x1377_67
Perl支持字符串使用Unicode,但是必须使用use utf-8并且文件保存为UTF-8的格式。
字符串字面量可以支持’’和””两种方式,’\n’不表示换行,表示两个字符\和n;”\n”表示换行。双引号内的(\特殊字符,例如:\n、\r等)表示换行、回车。


变量的定义:$加上变量名称,例如:$test=”hello world”。如果变量未被赋值,则使用空字符代替。未进行赋值的变量默认值为undef。如果变量未赋值就直接使用,数字类型为0,字符串类型为’’,例如:$sum+=3;$str.=”test”。
字符串中使用变量的两种方式:
- 双引号:print “Saying $test”。
- 单引号:print ‘Saying’.$test。
- 避免误解:print “Saying ${test}s“。//避免变量名称无法识别
- 字符串可以是用qq (hello,world)、q(hello,world)表示,qq代表字符串双引号,q代表单引号。()可以改为<>、//、{}等,qq <hellow,world>
操作符优先级:


比较操作符:

Perl布尔判断规则:
- 1. 如果是数字类型,0为假,其他都为真。
- 2. 如果是字符串类型,’’为假,其他都为真。
- 3. 如果不是字符串或者数字,先转换为数字或者字符串再判断。
- 4. 特殊规则:’0’与0是同一个标量值,因此也为假。
- 5. 特殊规则:undef表示假,所有的引用表示为真。
Perl输入信息:由于<STDIN>返回行中会带有’\n’,可以使用chomp()删除掉’\n’,例如:chomp($line=chomp(<STDIN>))
| $line=<STDIN>;//标准输入 If($line eq“\n”){ print … }else{ print … } | 
Perl使用规则:如果去掉括号不影响语义,可以不使用(),例如:chomp <STDIN>。
Perl的函数:
- 1. chomp:去除行末尾的’\n’,返回实际删除的字符数
- 2. defined:用于判断字符串是否为undef,使用defined($line),如果是undef返回假,否则返回真。
| $line=<STDIN> If(defined($line)){ print‘$line’ .”不是undef” }else{ print “\$line 是undef” } | 
列表与数组
Perl列表:列表存储的是标量有序集合。例如:(1,2,3)、(1..100)、($test,$test1,$test2)。
Perl数组:存储的是列表的变量的集合。数组最大索引值$#变量名称。也可以采用负值来表示:-1代表最后一个,-2代表倒数第二个,依次类推。
qw()表示为其添加单引号,因此字符串\n等会被转换为字符:qw可以省略字符串的引号,例如:(“test”,”test1”),可以使用qw(test test1)简写。可以不采用括号作为界定符,例如:qw ! test test1 !,qw #test test1 #等。
列表赋值:($test,$test1,$test2)=(“test”,”test1”,”test2”)。

@数组名称,就可以引用整个数组。

数组操作方法:pop和push,pop取出数组最后一个值,push在末尾追加一个元素。例如:pop @arr取出数组最后一个值并返回,push(@arr,0)向数组末尾追加0。

Shift和unshift,与pop和push类似,操作数组的起始元素。


splice操作数组任意位置。

foreach用法:foreach变量名称 (列表或者数组){
doSomething....
}
| #! /usr/bin/perl #$var 是数组元素的本身,如果修改变量也就是修改元素本身 foreach $var (qw /test test1 test2/){ print $var ."\n"; } #如果没有使用变量,则默认使用$_ foreach (1..100){ print $_ ."\n"; } | 
reverse:数组顺序反序。
sort:数组排序,如果是数字排序得不到有序的结果
each: 获取数组中的索引下标和值。类似key/value
子程序
Perl子程序:sub 子程序名称 { },子程序可以放在任意位置,并且是全局的,如果存在同名的子程序,则第一个会被覆盖。
| sub subName{ $n+=1;//全局变量 Print $n;//返回值为1,表示执行成功 } &subName;//调用子程序 | 
| sub sum{ $n+=1;//最后一个运算结果作为返回值 } | 
| #数组变量,参数会被存放在@_数组中,在程序执行时有效 sub max{ if($_[0]>$_[1]){ $_[0]; }else{ $[1]; } } | 
| #使用my创建私有变量 Sub max{ my($m,$n);#定义私有变量 ($m,$n)=@_;#将值赋值给变量 #my($m,$n)=@_; If($m>$n){$m}else{$n} } | 
| Sub max{ If(@_ !=2)#获取参数数组的长度 } | 
| Sub max{ state $line=0;#持久化变量,可以重复使用 $line+=1; } | 
use strict:强制使用严格的、良好的编程风格,会给出提示
调用子程序的三种情况:
- 1. 调用子程序并且传递参数:test(@lines)这种情况可以省略与符号。
- 2. 子程序在调用之前定义:sub test{ … },可以直接调用:test 222 ,333 ;可以省略与符号。
- 3. 如果子程序与内置函数同名,必须通过&符号说明调用的不是内置的函数。
Perl的state定义持久化变量



哈希
哈希的值可以是字符串、数字和undef,但是键必须为字符串。$hashName{key}。hash命名不能以数字开头,可以有字母、下划线、数字。
| #! /usr/bin/perl $family_name{"fred"}="li"; $family_name{"frid"}="luo"; foreach my $person (qw <fred frid> ){ print "$person family_name $family_name{$person} .\n"; } | 
指向整个hash可以使用%hashname。hash可以与列表互换
| %hashTest=("test1",21,"test2",1212,333,"test2","tes"); @arr_hash=%hashTest; | 
| my %hashReverse =reverse %hashTest;#获得反转的hash | 
| 获取key和value列表 @keyArr=key s %hashTest @valueArr=values %hashTest | 
| #each函数获取hash的键值对 while(($key,$value)=each %hashTest){#判断列表中获取到元素个数判断布尔 print $key; print $value; } | 
| #hash排序 foreach my $key (sort $key %hashTest){ $value=$hashTest{$key}; print $value; } | 
| #exists判断hash是否存在该key If(exists $hashTest{key}){ ... } | 
| #delete从hash中删除指定的key及对应的value delete $hashTest{key}; | 
| #%ENV获取环境变量 print $ENV(PATH);获取环境设置的PATH | 
正则表达式
| 类型 | 表达式 | 说明 | 例子 | 
| Unicode属性 | /ab/ | 匹配ab的字符串 | 
 | 
| /\p{Space}/ | 判断Unicode属于空白字符(p代表包含) | 
 | |
| /\p{Digit}/ | 判读Unicode属于数字字符 | 
 | |
| /\p{Hex}/ | 判断Unicode属于十六进制字符 | 
 | |
| /\P{Space}/ | 判断Unicode属于非空白字符(P代表不包含) | 
 | |
| 元字符 | . | 匹配任意一个字符,除"\n" | /by.e/匹配byte、byxe等 | 
| 量词 | * | 匹配0~n次字符 | /by\t*/匹配by\t\t\t等 | 
| .* | 匹配0~n次字符,除了\t | /by.*x/匹配byx、byxxx等 | |
| + | 匹配1~n次 | 
 | |
| ? | 匹配1次或者0次 | /ba_?ba/匹配ba_ba或者baba | |
| 模式分组 | () | 字符串分组 | /(red)+/匹配red 1~n次 | 
| 
 | /(.)\1/ | 反向匹配组 | abba匹配bb | 
| 
 | /(.)\g{1}/ | 反向匹配组 | 
 | 
| 
 | | | 或 | /frd(|\t)+bra/匹配出现一次\t、空格或者两者混合的字符串,并且重复1~n次 | 
| 
 | [] | 匹配字符集出现的任一字符 | 
 | 
| 
 | \d | 匹配数字[0-9] | 
 | 
| 
 | /a | /a放在末尾,表示按ASCII字符语义解释 | /\d+/a | 
| 
 | \s | 匹配任意空白字符与/\p{Space}/类似,[\f\t\n\r] | 
 | 
| 
 | \w | [a-zA-Z0-9] | 
 | 
| 
 | ^ | 代表非 | [^\d]非数字 | 
| 
 | \D | 非数字 | 
 | 
| 
 | \S | 非空白 | 
 | 
| 
 | \W | 非字符 | 
 | 
模式匹配
| 表达式 | 说明 | 例子 | 
| /i | 匹配大小写无关 | /yes/i 匹配yes或者YES | 
| /s | 匹配任意字符 | 
 | 
| /x | 在匹配表达式中加入空格 | |
| \A | 锚位字符串绝对开头 | m{\Ahttps?://}i判断是否以https开头 | 
| \z | 锚尾 | m{\.png\z}i | 
| \Z | 锚尾,允许后面出现换行符 | 
 | 
| \m | 代表字符串出现在行末,而不是结尾 | /test/m匹配$_="this is test is \m test!" | 
其他控制结构
1、unless(condition)当条件为假的时候执行,与if(condition)相反。
| unless(0){ ... } unless($key){ ... }else{ ...#条件为真的执行 } | 
2、until与while表达式相反,循环会一直执行,知道循环为真退出
| until($j>$i){ $j*=2; } | 
3、表达式修饰符
| if块简写 | print "hello world " if $n<2; | if($n<2){ print "hello world " } | 
| unless | 
 | 
 | 
| while | 
 | 
 | 
| until | 
 | 
 | 
| foreach | 
 | 
 | 
4、for
| for($i=1;$i<=10;$i++){ ... } | 
5、退出循环控制:只对循环控制最内层有效(last、next、redo),
| last |   | 
| next |   | 
| redo |   | 
| label |   | 
#获取指定目录下的文件名,并且开头不是 .
| my $dir_to_process = '/home/lincc/perlTrain/script'; opendir my $dh, $dir_to_process or die "Cannot open $dir_to_process: $!"; foreach $file ( grep { -f "/$dir_to_process/$_" and $_=~/^(?!\.)/m } readdir $dh) { print "one file in $dir_to_process is $file\n"; } closedir $dh; | 
Perl初学笔记的更多相关文章
- C++ STL初学笔记
		C++ STL初学笔记 更系统的版本见徐本柱的PPT set 在这儿:http://www.cnblogs.com/pdev/p/4035020.html #include <vector&g ... 
- Spring 初学笔记
		Spring 初学笔记: https://blog.csdn.net/weixin_35909255/article/category/7470388 
- laravel 5.6初学笔记
		laravel 5.6初学笔记 http://note.youdao.com/noteshare?id=bf4b701b49dd035564e7145ba2d978b4 框架简介 laravel文档齐 ... 
- csapp网络编程初学笔记
		csapp网络编程初学笔记 客户端-服务器编程模型 每个网络应用都是基于客户端-服务器模型,服务器管理某种资源,并且通过操作来为它的客户提供某种服务 客户端-服务器模型中的基本操作是transacti ... 
- Python初学笔记之字符串
		一.字符串的定义 字符串是就一堆字符,可以使用""(双引号).''(单引号)来创建. 1 one_str = "定义字符串" 字符串内容中包含引号时,可以使用转 ... 
- Ror初学笔记
		Ror正在以惊人的速度增长着,特别是在常常光顾JavaEye的时候发现Ror已经在国内有非常好的基础了,当然要凑个热闹尝尝鲜 咯. 眼下国内Ror的中文资料还是非常少的,到网上找找就仅仅有Eiffel ... 
- python 初学笔记 (一)
		初学python第一天,希望自己真正了解计算机语言,并且做出成效. 写下学习笔记,记录学习进度,娱乐学习,不断成长. python详细介绍: python是什么?运用到哪里?有哪些在使用它? pyth ... 
- Perl 学习笔记-列表和数组
		笔记来自<<Perl语言入门第5版>> 1. Perl中列表指标量的有序集合,数组则是存储列表的变量, 这两个术语经常混用,不过更精确地说,列表指数据,而数组指变量.数组的表示 ... 
- Perl 学习笔记-标量数据
		最近学习Perl, 准备看一遍入门指南,关键的东西还是记录下来,以便以后复习和查看参考. 笔记来自<<Perl语言入门第5版>> 1. 在Perl内部,不区分整数值和浮点数值, ... 
随机推荐
- 【HDU-4614】Vases and Flowers(线段树双查询)
			11946317 2014-10-23 09:08:28 Accepted 4614 437MS 2348K rid=11946317" target="_blank" ... 
- 自己封装js组件 - 中级中高级
			接着做关于alert组件的笔记 怎么又出来个中高级呢 对没错 就是出一个中高级来刷流量呵呵呵,但是中高级也不是白叫的 这次主要是增加了widget类,增加了自己绑定的事件和触发事件的方法!这么做是为什 ... 
- 状态压缩dp初学__$Corn Fields$
			明天计划上是要刷状压,但是作为现在还不会状压的\(ruoruo\)来说是一件非常苦逼的事情,所以提前学了一下状压\(dp\). 鸣谢\(hmq\ juju\)的友情帮助 状态压缩动态规划 本博文的大体 ... 
- 洛谷P3195 [HNOI2008]玩具装箱TOY(单调队列优化DP)
			题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具, ... 
- FragmentPagerAdapter和FragmentStatePagerAdapter的区别
			FragmentPagerAdapter 1:简单的介绍: 该类内的每一个生成的 Fragment 都将保存在内存之中,因此适用于那些相对静态的页,数量也比较少的那种:如果需要处理有很多页,并且数据动 ... 
- GoldenGate 异常处理预案
			异常处理一般步骤 如果GoldenGate复制出现异常,可以通过以下步骤尝试解决问题: 1) 通过ggsci>view report命令查找ERROR字样,确定错误原因并根据其信息 ... 
- UI Framework-1: Aura Client API
			Client API The Aura Client API is an API Aura uses to communicate with the client application using ... 
- 大数问题(相加)  A + B
			I have a very simple problem for you. Given two integers A and B, your job is to calculate the Sum o ... 
- Division Game UVA - 11859 Nim
			Code: #include<cstdio> #include<algorithm> using namespace std; #define maxn 10005 int n ... 
- d3的一些总结
			核心操作:https://blog.csdn.net/kriszhang/article/details/70174410 Update.Enter.Exit 简练详细说明:http://www.cn ... 
