perl语言入门
数据类型
数字
1.25 #小数
4.5e10 #科学计数法
255 #整数
64_4 #可以加下划线,等同于644
0377 #八进制的377
0xff #十六进制的ff
0b11111111 #二进制的11111111
字符串
单引号双引号都可以使用。
单引号类似于原意字符串,如果需要用到转义符或者单引号需要在前面加\,\表示转义符,'表示单引号。
双引号中的转义符就不需要多加一个\。
字符串通过.进行拼接,例如"hello" . "world"
。
字符串重复,可以通过小写字母x(不是*)进行,例如"fred"x3
表示"fredfredfred"
。
自动转换
perl会对数字与字符串进行自动转换,"12"*"3"会得到结果36。
字符串中非数字的部分(以及前置的空白符号)会被略过,完全不含数字的字符串会被转换成数字0。
添加警告
前三种简单警告,后两种比较详细。
- 方式1
#!/usr/bin/perl
use warnings;
- 方式2
perl -w file
- 方式3
#!/usr/bin/perl-w
- 方式4
#!/usr/bin/perl
use diagnostics;
- 方式5
perl -Wdiagnostics file
标量变量
使用$接字符串表示一个变量。
双目赋值
perl支持双目操作。
$fred + = 5 #自加5
$fred * = 5 #自乘5
$fred . = " " #结尾加空格
$fred **= 3 #取三次方
标量变量内插
$test = "hello"
$test2 = "$test world"等效于$test2 = "hello world"
如果这种情况下test没有被赋值,那么就为空。
在这种情况下如果后接字母数字或下划线,需要用{}将变量括起来。
例如${test}1
代码点与字符
chr()
表示代码点转字符,ord()
表示字符转代码点。
在双引号中可以直接用"\x{03B1}"这种实现转换。
程序结构
操作符优先级
与c一模一样,不再赘述。
if结构
if(){}
注意与c不同,这个{}不能少。
用户输入
用户输入用
$line = <STDIN>
会等待用户输入直到回车,这种情况下结尾一般都有换行符,可以通过chomp去除。
chomp($line=<STDIN>)
读入文字,略过换行符。
undef
未定义的变量为undef,作为数字使用时为0,作为字符串使用时为空字符串。
可以利用这种特性进行累加或者累乘。
也可以利用defined($test)判断test变量是否定义。
异常处理
die可以处理异常,在异常处终止程序运行。die "error ... $!";
后面这个变量是可读的系统错误信息。
数组与列表
数组的名字空间与标量的取名空间是分开的。、
也就是说,可以在同一个程序中既可以用fred[0]的数组,也可以用fred表示标量,两者互不干扰。
数组不需要定义大小,不够使用时会进行自动扩充。
可以使用下标-1访问最后一个元素,可以使用$#name
(name替换为数组的名字)获得数组的最后一个下标。
..范围操作符
(1..5)
表示1到5的列表。
qw
qw()表示单词列表,可以省去输入引号。
例如qw(fred hello world what)
,圆括号也可以替换为别的定界字符。
尽量避免定界符在列表中使用。
索引全部
使用符号@,@name = (@name , @name) #name数组复制并放到结尾
常用功能
- pop与push
$fred = pop(@array) #弹出最后一个元素,并赋给fred。
push @array,0 #在array的尾部插入0
push @array,@others #在array的尾部插入新数组
push @array,1..10 #在array的尾部插入1到10
- shift与unshift
与pop与push类似,处理开头。 - splice
splice可以有四个参数,第一个参数为数组,第二个参数为开始位置,第三个位置为操作长度,第四个位置为替换列表。
后两个可选。如果没有第三个参数,数组本身会删掉从开始位置到结尾并作为返回值,也可以设置为0,啥都不操作。
第四个参数的列表长度不一定要等于删去的长度。| - 取反
@fred = reverse @fred;
- 排序
@fred = sort @fred;
- 遍历
foreach $test (@tests){}
,如果在foreach之前有test这个变量,foreach循环完后test值依然为之前的值。如果不加变量名,默认用$_作为变量名。| - 数组内插
会在数组各个元素之间自动添加分隔用的空格。
子程序
- 定义
sub name{}
- 调用
&name;
,&大部分情况下可以省去。 - 返回值
不使用return时,最后执行的函数表达式值就是返回值。也可以用return中断并返回值。 - 传参
$n = $name(10,15);
- 使用参数
sub max{
if($_[0]>$_[1]){
$_[0];
}
else {
$_[1];
}
}
- 私有变量
my($name) = 5
这里的name就是一个私有变量。函数结束后自动销毁。 - 持久性私有变量
state $n = 0;
这里的n变量每次在函数运行后完会保存下来,下次调用函数可以继续使用。
输入输出
使用while可以读取多行输入。while(defined($line=<STDIN>)){}
为了筒写,约定俗成地,while(<STDIN>){}
等价于while(defined($_=<STDIN>)){}
print太简单的话,可以使用printf,使用格式如下:
printf "%d\n",42
,格式控制与c语言类似。
这里的格式控制本质就是个字符串,可以通过一定技巧输出数组。例如,
printf "%10s\n" x @items,@items;
依次输出数组中所有值。
say与print的使用类似,不同之处在于结尾自动添加换行,不需要\n。
在命令行中打开文件,./test <test_in >test_out
。
在代码中打开文件
open CONFIG, 'dino'; #直接打开,不指定方式
open CONFIG, '<dino'; #以读入方式打开
open CONFIG, '>dino'; #以写出方式打开
open CONFIG, '>>dino'; #以追加方式打开
close CONFIG; #把句柄关掉
while(<$CONFIG>){chomp;...} #使用读入文件句柄
print $CONFIG "hello world\n"; #使用写出文件句柄,不可以加逗号
select CONFIG; #改变默认文件句柄,之后的print不加句柄都是输出到CONFIG对应的文件中
hash表
类似于python的字典。
$family_name{$key_name}='test';#赋值
%somehash = ($key1,$value1,$key2,$value2...);#整个哈希赋值
%somehash = ($key1 => $value1,$key2 => $value2...);#整个哈希赋值,使用起来更方便
my %new_hash = reverse %hash; #哈希表键值对换
@k = keys %hash; #获取所有键
@v = values %hash; #获取所有值
while(($key,$value)=each %hash){...} #遍历键值对