Perl语言概览
Posted 小试机
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Perl语言概览相关的知识,希望对你有一定的参考价值。
“懒惰、性急和傲慢。伟大的Perl程序员拥有这些优点。” ————Larry Wall
Perl语言
Perl是一种多用途的开源解释型语言,主要作为脚本语言,并且运行在众多平台上,由于Perl的通用性,通常被称为程序设计语言的“瑞士军刀”。
Perl最初用于操作文件中的文本,从文件中提取数据和编写报表,经过不断的发展,他现在可以操作进程、执行网络任务、处理Web页面、与数据库通信,以及分析科学数据。
Perl使编程简单,灵活和快速,使用他的人都会喜欢他(就是这么不要脸!)。
Perl的格言:道路往往不止一条(There is more than one way to do it.)。
安装Perl解释器
Linux服务器往往自带Perl解释器,用户可以执行以下命令查看预装的Perl版本
perl -v
Windows系统可以下载ActivePerl进行安装,下载网址为:https://www.activestate.com/activeperl/downloads,下载后为exe文件,双击安装即可。
安装后执行
perl -v
出现以下结果,即表示Perl解释器安装成功。
Perl基本语法
打印输出 print和printf是Perl的两个内建函数,用于显示输出内容,使用示例如下:
print "hello, world!\n";
print "hello," , " world\n";
print("hello, world!\n");
print "The data and time are:" , localtime, "\n";
printf "hello, world\n";
printf("Meet %s Age:%5d Salary:\$%10.2f\n", "John", 40, 55000);
Perl变量支持三种基本的数据类型:标量、数组和哈希。变量无需在使用前声明。
标量:只能保持单个值,标量名必须以美元符号 $ 开头。
$first_name = "Melanie";
$salary = 12500.24;
print $first_name, $salary;
数组:数组是一组有序排列的标量,数组索引从0开始,数组变量以 @ 符号开头。
@names = ("Jessica", "Michelle", "Linda");
print "$names"; #prints the array with elements separated by a space
print "$names[0] and $names[1]";
print "$names[-1]"; #print "Linda"
$names[3] = "Nicole";
数组的常用内建函数: pop 移除最后一个元素 push 把新元素添加到数组的末尾 shift 移除第一个元素 unshift 把新元素添加到数组开头 splice 在数组指定位置添加或移除数组元素 sort 对数组元素进行排序
散列:是一组未经排序的键/值对(key-value),并通过字符串进行索引。散列变量以 % 号开头。
%employee = (
"name" => "Jessica",
"phone" => "12345",
"position" => "CEO"
);
print $employee{"name"}; #print "Jessica"
$employee{"SSN"} = "456-44556";
散列常用的内建函数: keys 检索散列数组中的所有键 values 检索散列数组中的所有值 each 检索散列中的某个键/值对 delete 删除某个键/值对
Perl中的预定义变量
$_ 在执行输入和模式搜索操作时使用的默认空格变量 $. 文件中最后处理的当前行号 $@ 由最近一个eval()运算符提供的Perl语法报错信息 $! 获取当前错误信息只,常用于die命令 $0 含有正在执行的程序名 $$ 正在执行本脚本的Perl进程号 @ARGV 含有命令行参数 ARGV 一个特殊的文件句柄,用于遍历@ARGV 中出现的所有文件名 @INC 库文件的搜索路径 @_ 在子例程中,@_变量含有传递给该子例程的变量内容 %ENV 散列变量%ENV含有当前环境信息 %SIG 散列变量%SIG含有指向信号内容的句柄
常量:固定不变的值,一旦设置就不能再更改,用户可以借助constant保留字来定义常量
use constant BUFFER_SIZE => 4096;
use constant ISBN => "0-13-028";
数字:Perl支持整数(十进制,八进制以及十六进制整数),浮点数,科学计数法,布尔值,以及null
$year = 2014;
$mode = 0775; #八进制
$product_price = 23.56;
$favorite_color = 0x33CC99 #十六进制
$distance_to_moon = 3.844e+5;
$bits = 0b101011;
字符串:位于引号内的一组字符,双引号中的数组,标量和反斜杠序列都是可以解释的。
$question = 'He asked her if she wouldn\'t mind going to Spain';
$line = "\tHe said he wouldn't take she to Spanin\n";
$temperature = "78";
print "It is currently $temperature degress."; # print It is currently 78 degress.
引用替换字符:Perl提供的一个替换形式。
print qq/Hello\n/; #same as: print "Hello\n";
print q/He owes $5.00/, "\n"; #same as: print 'He owes $5.00', "\n";
@states = qw(me mt ca fl); #same as: ("me", "mt", "ca", "fl");
$today = qx(date); #same as: $today = `date`;
运算符:常规运算符与其他语言一致主要有以下特殊运算符
. 字符串连接 x 字符串复制 =~ 表示相匹配 !~ 表示不匹配
print 'a' x 3; # reuslt: aaa
$color = "green";
print if $color =~ /^gr/;
$answer = "Yes";
print if $answer !~ /[Yy]/
语句:包括条件语句,循环语句
#条件判断
$day_of_week = int(rand(7)) + 1;
print "Today is: $day_of_week\n";
if( $day_of_week >= 1 && $day_of_week <= 4 ){
print "aa";
}elsif ($day_of_week == 5){
print "bb";
}else{
pint "cc";
}
#三目运算
$coin_toss = int(rand(2)) + 1;
print ($coin_toss == 1 ? "yes" : "no");
#while循环
$count = 0;
while($count < 10){
print $count;
$count++;
}
#for循环
for($count = 0; $count < 10; $count++){
print "$count\n";
}
#foreach循环
@dessert = ("ice cream", "cake", "pudding", "fruit");
foreach $choice (@dessert){
echo $choice;
}
循环控制: last 可以跳出循环,类似于 break nect 跳过本次循环,类似于 continue
子例程:子例程是Perl中的称呼,实际就是函数,子例程定义方式见一下示例。
#定义子例程
sub is_leap_year{
my $year = shift(@_); #@_中含有传递给这个函数的参数,shift取出第一个参数。
return (($year % 4 == 0) && ($year % 100 != 0)) || (($year % 400 == 0) ? 1 : 0);
}
#调用子例程
$my_year = 2000;
is_leap_year($my_year);
文件处理:Perl函数提供了open函数用于打开文件,也提供了pipe用于读写、追加文件内容。
'<' 意思是读 '>' 意思是写 '>>' 意思是追加写入 '+<' 意思是先读后写 '+>' 意思是先写后读
#打开aa.txt文件
open(FH, "<aa.txt") or die "Can't open file: $!\n";
#一行一行读取文件内容,并打印到屏幕上
while(<FH>){
print;
}
#一次读取全部内容并打印
@lines = <FH>;
print "@lines\n";
#将数据写入aa.txt文件
open(FH, ">aa.txt") or die "Can't open file: $!\n";
print FH "This line is written to the file.\n";
#检查文件的属性
$file = 'aa.txt';
print "File is readable, writeable, and executable\n" if -r $file and -w $file and -x $file;
管道:管道用于把操作系统输出内容作为输入流传送给Perl,或者将Perl的输出内容转发给系统命令以作为其输入。如果 | 出现在命令之前,表示该命令将perl的输出作为输入。
#读取操作系统的ls命令执行后的输出,并打印
open(F, "ls |") or die;
while(<F>){
print;
}
#操作系统读取print的输入并进行排序
open(SORT, "| sort") or die;
print SORT "dogs\ncats\nbirds\n";
正则表达式:Perl作为擅长的一项,正则的规则需要单独学习。
#判断是否匹配
$_ = "hello world, WORLD, world";
print if /he/;
#将world替换为lanxi,值替换第一个world,结果为:hello lanxi, WORLD, world
$str = "hello world, WORLD, world";
$str =~ s/world/lanxi/;
print $str;
#忽略大小写,全部替换,结果为:hello lanxi, lanxi, lanxi
$str = "hello world, WORLD, world";
$str =~ s/world/lanxi/ig;
print $str;
#e会进行计算,结果为:He give me 42 dollars.
$str = "He give me 5 dollars.";
$str =~ s/5/6*7/e;
print $str;
在命令行下传送参数:Perl通过@ARGV数组保存了命令行提供的参数内容。
#命令行输入的内容
$ perl text.l aa bb cc
#脚本内容
print "@ARGV\n"; #输出: aa bb cc
#如果 aa,bb,cc是文件的名称,以下代码会打开文件,并且打印到屏幕上
while(<ARGV>){
print;
}
#标量,数组和散列
$age = 25;
@siblings = qw("Nick", "Chet", "Dolly");
%employee = (
"name" => "Jessica",
"phone" => "12345",
"position" => "CEO"
);
#获取他们的引用
$pointer1 = \$age;
$pointer2 = \@siblings;
$ponter3 = \%employee;
#使用引用
print $$pointer1; # 25
print @$pointer2; #Nick Chet Dolly
print %$pointer3;
print $pointer2->[1]; #Chet
print $pointer3->{'name'}; #Jessica
对象:Perl中的对象是一种特殊类型的变量,一个类代表着含有一组变量与函数的一个包。
#创建一个对象
package Person;
sub new
{
my $class = shift;
my $self = {
_firstName => shift,
_lastName => shift,
_ssn => shift,
};
# 输出用户信息
print "名字:$self->{_firstName}\n";
print "姓氏:$self->{_lastName}\n";
print "编号:$self->{_ssn}\n";
bless $self, $class;
return $self;
}
sub setFirstName {
my ( $self, $firstName ) = @_;
$self->{_firstName} = $firstName if defined($firstName);
return $self->{_firstName};
}
sub getFirstName {
my( $self ) = @_;
return $self->{_firstName};
}
#使用该对象
use Person;
$object = new Person( "小明", "王", 23234345);
# 获取姓名
$firstName = $object->getFirstName();
print "设置前姓名为 : $firstName\n";
# 使用辅助函数设置姓名
$object->setFirstName( "小强" );
# 通过辅助函数获取姓名
$firstName = $object->getFirstName();
print "设置后姓名为 : $firstName\n";
其他
库和模块:库文件都带有.pl扩展名,而模块则拥有 .pm 扩展名。 库的路径:@INC数组负责保存一组标准Perl库的路径列表。 导入外部文件:如需要导入某个外部文件,应使用require或者use关键字。
require("getopts.pl"); #导入getopts.pl文件
use CGI; #使用CGI.pm 模块
诊断模式:如需在Perl脚本退出时获得出错原因等信息,用户可以使用内建的的die函数或者exit函数。
open(FH, "filename") or die "Couldn't open filename: $!\n";
if($input !~ /^\d+$/){
exit(1);
}
use warnings; 提供警示信息,但不退出程序 use diagnostics; 提供详细的警示信息,但不退出程序 use strict; 检查全局变量,无引号单词等内容 use Carp; 与die函数类似,但能提供更多程序出错信息
关于小试机
以上是关于Perl语言概览的主要内容,如果未能解决你的问题,请参考以下文章
从其他语言(如 Java、PHP、Perl、Python 等)调用 C/C++ 代码的最佳方法是啥?