Perl语言基础
文章目录
- 0. 杂记
- 1. 注释
- 2. 数据类型
- 2.1 标量
- 2.1.1 数值标量
- 2.1.2 字符标量
- 2.1.3 标量操作
- 2.1.4 多行字符串
- 2.1.5 特殊标量
- 2.2 数组
- 2.2.1 声明数组
- 2.2.2 序列数组
- 2.2.3 数组大小
- 2.2.4 添加和删除
- 2.2.5 数组切片
- 2.2.6 数组替换
- 2.2.7 字符串转数组
- 2.2.8 数组转换为字符串
- 2.2.9 数组排序
- 2.2.10 特殊变量
- 2.2.11 合并数组
- 2.3 散列
- 2.3.1 声明
- 2.3.2 提取切片
- 2.3.3 提取键值
- 2.3.4 检查元素是否存在
- 2.3.5 获取大小
- 2.3.6 添加和删除
- 2.4 字符串
- 3. 条件分支
- 4. 循环控制
- 5. 运算符
- 6. 子程序
- 7. 指针/引用
- 8. 文件操作
- 8.1 打开文件
- 8.2 关闭文件
- 8.3 FILEHANDLE运算符
- 8.3 复制文件
- 8.4 重命名文件
- 8.5 删除文件
- 8.6 文件信息
- 9. 目录操作
- 9.1 标准函数
- 9.2 显示所有文件
- 9.3 创建目录
- 9.4 删除目录
- 9.5 更改目录
- 10. 错误处理
- 11. 特殊变量
Perl(Practical Extraction and Report Language)
0. 杂记
查看版本信息:perl -v
#!/usr/bin/perl
# This will print "Hello, World"
print "Hello, world\n";
第一行#!/usr/bin/perl
是Perl的路径,根据实际情况修改,通过which perl
命令来确认路径
- Perl语言不关心空格,但在引号内按原样打印
- 双引号会对转义字符进行转义,单引号不会转义
- 变量以$、@和%开头
1. 注释
- 单行注释:
#
- 多行注释:以
=
开头的行被解释为嵌入式文档(pod)的开始,并且编译器忽略下一个=cut
之前的所有后续行
#!/usr/bin/perl
# This will print "Hello, World"
print "Hello, world\n";=begin comment
This is all part of multiline comment.
You can use as many lines as you like
These commnets will be ignored by the compiler util the next =cut is encountered
=cut
2. 数据类型
创建一个变量时,会在内存中保留一些空间
标量Scalar | 标量是简单的变量,前面有一个$符号,标量可以是数字、字符串或指针,指针实际上是变量的地址 |
数组Arrays | 数组是标量的有序列表,可以使用从0开始的数字索引访问它们,前面是一个@ |
散列Hashes | 使用键作为上下标的无序键/值对集合,前面是一个百分号% |
2.1 标量
标量是一个数据单元,该数据可能是整数、浮点数、字符、字符串
#!/usr/bin/perl
$age = 25; # a integer assignment
$name = "John Pail"; # a string
$salary = 1453.2; # a folating pointprint "Age = $age\n";
print "Name = $name\n";
print "Salary = $salary\n";
2.1.1 数值标量
#!/usr/bin/perl
$interger = 200;
$negative = -300;
$floating = 200.340;
$bigfloat = -1.2E-23;#377 octal, same as 255 decimal
$octal = 0377;#FF hex, also 255 decimal
$hexa = 0xff;print "integer = $integer\n"; #200
print "negative = $negative\n"; #-300
print "floating = $floating\n"; #200.34
print "bigfloat = $bigfloat\n"; #-1.2e-23
print "octal = $octal\n"; #255
print "hexa = $hexa\n"; #255
2.1.2 字符标量
#!/usr/bin/perl
$var = "This is string scalar!";
$quato = 'I am inside single quote -$var';
$double = "This is inside single quote -$var";
$escape = "This example of escape -\tHello,World!";print "var = $var\n"; #This is string scalar!
print "quote = $quote\n"; #I am inside single quote -$var
print "double = $double\n"; #This is inside single quote -This is string scalar!
print "escape = $escape\n"; #This example of escape - Hello,World!
2.1.3 标量操作
#!/usr/bin/perl
$str = "hello"."world"; #Concatenates strings
$num = 5 + 10; #adds two numbers
$mul = 4 * 5; #multiplies two numbers
$mix = $str . $num; #concatenates string and numberprint "str = $str\n"; #helloworld
print "num = $num\n"; #15
print "mul = $mul\n"; #20
print "mix = $mix\n"; #helloworld15
2.1.4 多行字符串
想在程序中引入多行字符串,使用单引号
#!/usr/bin/perl
$string = 'This is
a multiline
string';print "$string\n";
2.1.5 特殊标量
_FILE_
,_LINE_
,_PACKAGE_
代表程序中那个点的当前文件名、行号和包号
#!usr/bin/perl
print "File name". _FILE_ . "\n";
print "Line numbers" . _LINE_ . "\n";
print "Package" . _PACKAGE_ . "\n";#they can not be interpolated
print "_FILE_ _LINE_ _PACKAGE_\n";
2.2 数组
数组是存储标量值的有序列表,数组前是@,使用$变量名称[]
进行索引。
@age = (25, 30, 40);
@name = ("John","Lisa","Tom");print "\$age[0] = $age[0]";
print "\$name[0] = $name[0]";
2.2.1 声明数组
以@
为前缀,并使用括号
或qw运算符
填充
qw//
返回一个字符串列表,用空格分隔
@array = (1,2,'hello');
@array = qw/THis is an array/;
2.2.2 序列数组
#!/usr/bin/perl
@var_10 = (1..10);print "@var_10\n"; #Prints number from 1 to 10
2.2.3 数组大小
可以使用数组上的标量上下文确定,返回值将是数组中的元素数,物理大小,不是元素的数量
#!/usr/bin/perl
@array = (1,2,3);
$array[50] = 4;$size = @array;
$max_index = $#array;print "Size: $size\n"; #51
print "Max Index: $max_index\n"; #50
2.2.4 添加和删除
末尾操作:push、pop
头部操作:shift、unshift
#!/usr/bin/perl
#create a simple array
@coins = ("Quarter","Dime","Nickel");
print "1、\@coins = @coins\n"; #1、@coins = Quarter Dime Nickel#add one element at the end of the array
push(@coins, "Penny");
print "2、\@coins = @coins\n""; #2、@coins = Quarter Dime Nickel Penny#add one element at the beginning of the array
unshift(@coins, "Dollar");
print "3、\@coins = @coins\n""; #3、@coins = Dollar Quarter Dime Nickel Penny#remove one element from the last of the array
pop(@coins);
print "4、\@coins = @coins\n""; #4、@coins = Dollar Quarter Dime Nickel#remove one element from the beginning of the array
shift(@coins);
print "5、\@coins = @coins\n""; #5、@coins = Quarter Dime Nickel
2.2.5 数组切片
从数值中选择多个元素以生成另一个数组
#!/usr/bin/perl
@day = qw/Mon Tue Wed Thu Fri Sat Sun/;
@weekday = @day[3,4,5]; #or @weekday = @day[3..5];print "@weekdays\n"; #Thu Fri Sat
2.2.6 数组替换
删除由OFFSET和LENGTH指定的@ARRAY的元素,并用LIST(如果指定)替代,最后返回从数组中删除的元素
splice @ARRAY,OFFSET [ , LENGTH, [ , LIST]]
#!/usr/bin/perl
@nums = (1..20);
print = "Before - @nums\n";splice(@nums, 5, 5, 21..25);
print = "After - @nums\n"; #从第6个数字开始,将5个元素从6替换到10,分别是21、22、23、24、25
2.2.7 字符串转数组
将字符串拆分为一个字符串数组,如果指定LIMIT,则最多拆分为该数量的字段,如果省略PATTERN,则在空格出拆分
split [PATTERN [ , EXPR [ , LIMIT]]]
#!/usr/bin/perl
#define Strings
$var_string = "Rain-Drops-On-Roses-And-Whiskers-On-Kittens";
$var_names = "Larry, David, Roger, Ken, Michael, Tom";#transform above string into arrays
@string = split('_', $var_string);
@names = split(',', $var_names);print "$string[3]\n"; # Roses
pring "$names[4]\n"; # Michael
2.2.8 数组转换为字符串
jion EXPR, LIST
#!/usr/bin/perl
#define Strings
$var_string = "Rain-Drops-On-Roses-And-Whiskers-On-Kittens";
$var_names = "Larry, David, Roger, Ken, Michael, Tom";#transform above string into arrays
@string = split('_', $var_string);
@names = split(',', $var_names);$string1 = join('-',@string);
$string2 = join(',',@names);
print "$string1\n";
print "$string2\n";
2.2.9 数组排序
sort LIST
根据单词的ASCII数值执行
#!/usr/bin/perl#define an array
@foods = qw(pizza steak chicken burgers);
print "Before: @foods\n";#sort this array
@foods = sort(@foods);
print "After: @foods\n";
2.2.10 特殊变量
$[
这个特殊变量是一个标量,包含所有数组的第一个索引。Perl数组具有从零开始的索引,所以几乎总为0
#!/usr/bin/perl#define an array
@foods = qw(pizza steak chicken burgers);
print "Foods: @foods\n";#Let's reset first index of all the arrays
$[ = 1;print "Food at \@foods[1]: $foods[1]\n"; #pizza
print "Food at \@foods[2]: $foods[2]\n"; #steak
#没改之前是steak和chicken
2.2.11 合并数组
#!/usr/bin/perl
@number = (1,3,(4,5,6));
print "number = @numbers\n"; #1 3 4 5 6
#!/usr/bin/perl
@odd = (1,3,5);
@even = (2,4,6);@number = (@odd,@even);
print "numbers = @numbers\n"; #1 3 5 2 4 6
2.3 散列
散列是一组键值对,前面是一个%,使用$变量名{键}
来索引值
#!/usr/bin/perl
%data = ('John'=>45, 'Lisa'=>30,'Tom'=>40);
print "\$data{'John Paul'} = $data{'John Paul'}\n";
2.3.1 声明
$data{'John'}=45;
$data{'Lisa'}=30;
$data{'Tom'}=40;%data = ('John',45, 'Lisa',30,'Tom',40);%data = ('John'=>45, 'Lisa'=>30,'Tom'=>40);
2.3.2 提取切片
#!/usr/bin/perl
%data = ('John'=>45, 'Lisa'=>30,'Tom'=>40);
@array = @data{'John','Lisa'};
print "Array : @array\n"; #45 30
2.3.3 提取键值
keys %HASH
获取key
#!/usr/bin/perl
%data = ('John Paul'=>45, 'Lisa'=>30, 'Kumar'=>40);
@names = keys %data;print "$names[0]\n"; #John Paul
values %HASH
获取value
#!usr/bin/perl
%data = ('John Paul'=>45, 'Lisa'=>30, 'Kumar'=>40);
@ages = values %data;
print "@ages[0]\n"; #40
2.3.4 检查元素是否存在
exists()
#!/usr/bin/perl
%data = ('John Paul'=>45, 'Lisa'=>30, 'Kumar'=>40);
if(exists($data{'Lisa'})){print "Lisa is $data{'Lisa'} years old\n";
}else{print "I don't know age of Lisa\n";
}
2.3.5 获取大小
通过在键或值上使用标量上下文来获取大小,即哈希中的元素数,即必须得到一个键或值得数组,然后得到数组的大小
#!/usr/bin/perl
%data = ('John Paul'=>45, 'Lisa'=>30, 'Kumar'=>40);@keys = keys %data;
$size = @keys;
print "1 - Hash size: is $size\n";@values = values %data;
$size = @values;
print "2 - Hash size: is $size\n";
2.3.6 添加和删除
赋值
和delete
#!/usr/bin/perl
%data = ('John Paul'=>45, 'Lisa'=>30, 'Kumar'=>40);
@keys = keys %data;
$size = @keys;
print "1 - Hash size: is $size\n"; # 3#adding an element to the hash
$data{'Ali'}=55;
@keys = keys %data;
$size = @keys;
print "2 - Hash size: is $size\n"; # 4#delete the same element from the hash
delete $data{'Ali'};
@keys = keys %data;
$size = @keys;
print "3 - Hash size: is $size\n"; # 3
2.4 字符串
- 字符串是字符序列,有单引号和双引号分隔
- 双引号字符串需要变量插值,单引号不允许。
- 转义字符
Perl根据上下文不同地对待相同名称的变量
#!/usr/bin/perl
@name = ('John','Lisa','Tom');@copy = @name;
$size = @name;print "Given name are : @copy\n"; #John Lisa Tom
print "Number of name : $size\n"; # 3
3. 条件分支
在Perl中,数字0、字符串‘0’和“ ”、空列表()和undef在布尔上下文中都是false,所有其他值都是true
if
if...else
if... elsif...else
unless
与if逻辑相反
unless...else
unless...elsif...else
switch
允许一种简单的方法将变量值与各种条件进行比较
Exp1 ? Exp2 : Exp3
4. 循环控制
while
until
for
foreach
do...while
5. 运算符
算术:+
-
*
/
%
**
等式:==
!=
>
<
>=
<=
<=>
:返回值可以-1 0 1,如果是-1则小于
小于lt
大于gt
小于等于le
大于等于ge
等于eq
不等于ne
cmp
:返回-1,则小于
赋值:=
+=
-=
*=
/=
**=
位运算:&
|
^
~
<<
>>
逻辑:and
&&
or
||
not
引用:
q{}
— q{abcd}='abcd'
qq{}
—qq{abcd}="abcd"
qx{}
—qx{abcd}='abcd'
其他
.
字符串拼接
x
('-'x3)
=> ---
..
(2..5)
=> (2,3,4,5)
++
--
自增 自减
->
$obj->$a
=> 拿到obj中的a
6. 子程序
#!/usr/bin/perl
#Function definition
sub Hello{print "Hello, World!\n";
}
#Function call
Hello();
特殊数组@_
#!/usr/bin/perl
#Function definition
sub Average{#get total number of arguments passed.$n = scalar(@_);$sum = 0;foreach $item(@_){$sum += $item;}$average = $sum/$n;print "Average for the given numbers : $average\n ";
}#Function call
Average(10,20,30);
如果必须将列表与其他标量参数一起传递,则将列表作为最后一个参数
#!/usr/bin/perl
#Function definition
sub PrintList{my @list = @_;print "Given list is @list\n");
}
$a = 10;
@b = (1,2,3,4);#Function call with list parameter
PrintList($a, @b);
散列传递给子程序
#!/usr/bin/perl
#Function definition
sub PrintHash{my (%hash) = @_;foreach my $key(keys %hash){my $value = $hash{$key};print "$key : $value\n";}
}
%hash = ('name'=>'Tom', 'age'=>19);#Function call with hash parameter
PrintHash(%hash);
私有变量
my
运算符创建变量
sub somefunc{my $variable; # $variable is invisible outside somefunc()my ($another, @an_array, %a_hash); #declaring many variable at once
}
局部变量
local
#!/usr/bin/perl
#Global variable
$string = "Hello, World!";sub PrintHello{#Private variable for PrintHello functionlocal $string;$string = "Hello,Perl";PrintMe();print "Inside the function PrintHello $string\n";
}
subPrintMe{print "Inside the function PrintMe $string\n";
}#Function call
PrintHello(); #Hello Perl
print "Outside the function $string"; # Hello World
state变量
state
全局变量
#!/usr/bin/perl
use feature 'state';sub PrintCount{state $count = 0; #initial valueprint "Value of counter is $count\n";$count++;
}for(1..5){PrintCount(); # 0 1 2 3 4
}
7. 指针/引用
反斜杠\
$scalarref = \$foo;
$arrayref = \@ARGV;
$hashref = \%ENV;
$coderef = \&handler;
创建数组的指针
$arrayref = [1,2,['a','b','c']];
哈希的指针
%hashref = {'Adam' => 'Eve','Clyde' => 'Bonnie'
};
子程序指针
$coderef = sub {print "Boink!\n"}
指针引用
使用$、@和%作为前缀
$var = 10;
$r = \$var;
print "value of $var is : ",$$r,"\n");@var = (1,2,3);
$r = \@var;
print "Value of @var is:", @$r, "\n");%var = ('key1'=>10, 'key2'=>20);
$r = \%var;
print "Value of %$r is:", %$r, "\n";
确定变量类型
ref
SCALAR、ARRAY、HASH、CODE、GLOB、REF
#!/usr/bin/perl$var = 10;$r = \$var;print "Reference type in r :", ref($r),"\n"; #SCALAR@var = (1,2,3);$r = \@var;print "Reference type in r :", ref($r),"\n"; #ARRAY%var = ('key1'=>10,'key2'=>20);$r = \%var;print "Reference type in r :", ref($r),"\n"; #HASH
函数的指针
\&
#Function defination
sub PrintHash{my (%hash) =@_;foreach $item(%hash){print "Item : $item\n";}
}
%hash = ('name'=>'Tom', 'age'=>19);$cref = \&PrintHash;
&$cref(%hash);
8. 文件操作
将文件句柄与文件相关联,然后使用Perl中的各种运算符合函数读写与文件句柄关联的文件
STDIN
STDOUT
STDERR
分别代表标志输入、标准输出和标准错误输出
8.1 打开文件
以只读模式打开file.txt,<
符号表示文件以只读
模式打开
DATA是文件句柄,用于读取文件
open(DATA, "<file.txt");
将打开一个文件并将其内容打印到屏幕上
#!/usr/bin/perl
open(DATA,"<file.txt") or die "Couldn't open file.txt,$!";while(<DATA>){while(<DATA>){print "$_";}}
以写入模式打开file.txt,>
符号表示文件以写入
模式打开
open(DATA,">file.txt") or die "Couldn't open file.txt,$!";
不同模式
<
orw
Read Only Access>
orw
Creates,Writes, and Truncates>>
ora
Writes, Appends, and Creates+<
orr+
Reads and Writes+>
orw+
Reads, Writes,Creates, and Truncates+>>
ora+
Reads,Writes, Appends, and Creates
8.2 关闭文件
close(DATA) || die "Couldn't close file properly";
8.3 FILEHANDLE运算符
在标量上下文中,从文件句柄返回一行
#!/usr/bin/perl
print "What is your name?\n";
$name = <STDIN>;
print "Hello $name\n";
在列表上下文中使用,从指定的文件句柄返回行列表
#!/usr/bin/perl
open(DATA,"<import.txt") or die "Can't open data";
@lines = <DATA>;
close(DATA);
8.3 复制文件
打开一个现有文件file1.txt逐行读取,生成另一个副本文件file2.txt
#!/usr/bin/perl
#Open file to read
open(DATA1,"<file1.txt");#Open new file to write
open(DATA2,">file2.txt");#Copy data from one file to another
while(<DATA1>){print DATA2 $_;
}
close (DATA1);
close (DATA2);
8.4 重命名文件
将文件file1.txt重命名为file2.txt
rename("/usr/test/file1.txt","/usr/test/file2.txt");
8.5 删除文件
unlink ("/usr/test/file1.txt");
8.6 文件信息
-X
测试运算符
9. 目录操作
9.1 标准函数
opendir DIRHANDLE, EXPR
readdir DIRHANDLE
rewinddir DIRHANDLE
— Positioning pointer to the beginingtelldir DIRHANDLE
— Returns current position of the dirseekdir DIRHANDLE,POS
— Pointing pointer to POS inside dirclosedir DIRHANDLE
9.2 显示所有文件
使用glob
运算符获取并列出所有文件
#Display all the files in /tmp directory
$dir = "/tmp/*";
my @files = glob($dir);foreach(@files){print $_ . "\n";
}#Display all the C source files in /tmp directory
$dir = "/tmp/*.c";
@files = glob($dir);foreach(@files){print $_ . "\n";
}#Display all the hidden files
$dir = "/tmp/.*";
@files = glob($dir);
foreach(@files){print $_ . "\n";
}
#Display all the files from /tmp and /home directories
$dir = "/tmp/* /home/*";
@file = glob($dir);
foreach(@files){print $_ . "\n";
}
打开一个目录并列出该目录中所有可用的文件
opendir (DIR,".") or die "Couldn't open directory, $!";
while($file = readdir DIR){print "$file\n";
}
closedir DIR;
opendir (DIR,".") or die "Couldn't open directory, $!";
foreach(sort grep(/^.*\.c$/,readdir(DIR))){print "$_\n";
}
closedir DIR;
9.3 创建目录
$dir = "/tmp/perl";
#This creates perl directory in /tmp directory
mkdir($dir) or die "Couldn't creates $dir directory,$!";
print "Directory created successfully\n";
9.4 删除目录
$dir = "/tmp/perl";
#This removes perl directory in /tmp directory
rmdir($dir) or die "Couldn't creates $dir directory,$!";
print "Directory removed successfully\n";
9.5 更改目录
$dir = "/home";
#This changes perl directory and moves you inside /home directory
chdir($dir) or die "Couldn't go inside $dir directorym, $!";
print "Your new location is $dir\n";
10. 错误处理
一个健壮的出现如果发生错误,进行适当的报告定位,然后停止。
if语句
if(open(DATA,$file)){...
}else{die "Error: Couldn't open the file - $!";
}
or
open(DATA,$file) || die "Error: Couldn't open the file $!";
$!
—Shell最后运行的后台Process的PID
unless函数
unless函数与if逻辑相反,只有在表达式返回false时才执行
例如:只有在chdir操作失败时才会die
unless(chdir("/ect")){die "Error:Can't change directory- $!";
}
or
die "Error:Can't change directory- $!"; unless(chdir("/ect"))
三元运算符
print(exists($hash{value}) ? 'There ' : 'Missing' , "\n");
warn函数
只是发出一个警告,消息被打印到STDERR,但没进一步的行为。
chdir('/etc') or warn "Can't change directory";
die函数
工作方式与warn一样,会调用exit
chdir('/etc') or die ""Can't change directory;
11. 特殊变量
$_
—默认输入
foreach('hickory','dickory','doc'){print $_;print "\n"; #hickory dickory doc
}
全局标量特殊变量$_
全局数组特殊变量@ARGV 脚本输入参数列表
全局哈希特殊变量%ENV 包含环境变量
全局特殊文本句柄STDIN 标准输入
全局特殊常量_FILE_ 程序执行当前文件
正则表达式特殊变量$digit
$1表示正则表达式匹配中第一组括号中包含的任何内容