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){...} #遍历键值对
posted @ 2024-10-23 10:05  心比天高xzh  阅读(6)  评论(0编辑  收藏  举报