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版本

 
   
   
 
  1. perl -v

Windows系统可以下载ActivePerl进行安装,下载网址为:https://www.activestate.com/activeperl/downloads,下载后为exe文件,双击安装即可。 

 安装后执行

 
   
   
 
  1. perl -v

出现以下结果,即表示Perl解释器安装成功。 

Perl基本语法

打印输出 print和printf是Perl的两个内建函数,用于显示输出内容,使用示例如下:

 
   
   
 
  1. print "hello, world!\n";

  2. print "hello," , " world\n";

  3. print("hello, world!\n");

  4. print "The data and time are:" , localtime, "\n";

  5. printf "hello, world\n";

  6. printf("Meet %s Age:%5d Salary:\$%10.2f\n", "John", 40, 55000);

Perl变量支持三种基本的数据类型:标量、数组和哈希。变量无需在使用前声明。

标量:只能保持单个值,标量名必须以美元符号 $ 开头。

 
   
   
 
  1. $first_name = "Melanie";

  2. $salary = 12500.24;

  3. print $first_name, $salary;

数组:数组是一组有序排列的标量,数组索引从0开始,数组变量以 @ 符号开头。

 
   
   
 
  1. @names = ("Jessica", "Michelle", "Linda");

  2. print "$names"; #prints the array with elements separated by a space

  3. print "$names[0] and $names[1]";

  4. print "$names[-1]"; #print "Linda"

  5. $names[3] = "Nicole";

数组的常用内建函数: pop 移除最后一个元素 push 把新元素添加到数组的末尾 shift 移除第一个元素 unshift 把新元素添加到数组开头 splice 在数组指定位置添加或移除数组元素 sort 对数组元素进行排序

散列:是一组未经排序的键/值对(key-value),并通过字符串进行索引。散列变量以 % 号开头。

 
   
   
 
  1. %employee = (

  2.  "name" => "Jessica",

  3.  "phone" => "12345",

  4.  "position" => "CEO"

  5. );

  6. print $employee{"name"}; #print "Jessica"

  7. $employee{"SSN"} = "456-44556";

散列常用的内建函数: keys 检索散列数组中的所有键 values 检索散列数组中的所有值 each 检索散列中的某个键/值对 delete 删除某个键/值对

Perl中的预定义变量

$_ 在执行输入和模式搜索操作时使用的默认空格变量 $. 文件中最后处理的当前行号 $@ 由最近一个eval()运算符提供的Perl语法报错信息 $! 获取当前错误信息只,常用于die命令 $0 含有正在执行的程序名 $$ 正在执行本脚本的Perl进程号 @ARGV 含有命令行参数 ARGV 一个特殊的文件句柄,用于遍历@ARGV 中出现的所有文件名 @INC 库文件的搜索路径 @_ 在子例程中,@_变量含有传递给该子例程的变量内容 %ENV 散列变量%ENV含有当前环境信息 %SIG 散列变量%SIG含有指向信号内容的句柄

常量:固定不变的值,一旦设置就不能再更改,用户可以借助constant保留字来定义常量

 
   
   
 
  1. use constant BUFFER_SIZE => 4096;

  2. use constant ISBN => "0-13-028";

数字:Perl支持整数(十进制,八进制以及十六进制整数),浮点数,科学计数法,布尔值,以及null

 
   
   
 
  1. $year = 2014;

  2. $mode = 0775; #八进制

  3. $product_price = 23.56;

  4. $favorite_color = 0x33CC99 #十六进制

  5. $distance_to_moon = 3.844e+5;

  6. $bits = 0b101011;

字符串:位于引号内的一组字符,双引号中的数组,标量和反斜杠序列都是可以解释的。

 
   
   
 
  1. $question = 'He asked her if she wouldn\'t mind going to Spain';

  2. $line = "\tHe said he wouldn't take she to Spanin\n";

  3. $temperature = "78";

  4. print "It is currently $temperature degress."; # print It is currently 78 degress.

引用替换字符:Perl提供的一个替换形式。

 
   
   
 
  1. print qq/Hello\n/; #same as: print "Hello\n";

  2. print q/He owes $5.00/, "\n"; #same as: print 'He owes $5.00', "\n";

  3. @states = qw(me mt ca fl); #same as: ("me", "mt", "ca", "fl");

  4. $today = qx(date); #same as: $today = `date`;

运算符:常规运算符与其他语言一致主要有以下特殊运算符

. 字符串连接 x 字符串复制 =~ 表示相匹配 !~ 表示不匹配

 
   
   
 
  1. print 'a' x 3; # reuslt: aaa

  2. $color = "green";

  3. print if $color =~ /^gr/;

  4. $answer = "Yes";

  5. print if $answer !~ /[Yy]/

语句:包括条件语句,循环语句

 
   
   
 
  1. #条件判断

  2. $day_of_week = int(rand(7)) + 1;

  3. print "Today is: $day_of_week\n";

  4. if( $day_of_week >= 1 && $day_of_week <= 4 ){

  5.  print "aa";

  6. }elsif ($day_of_week == 5){

  7.  print "bb";

  8. }else{

  9.  pint "cc";

  10. }

  11. #三目运算

  12. $coin_toss = int(rand(2)) + 1;

  13. print ($coin_toss == 1 ? "yes" : "no");

  14. #while循环

  15. $count = 0;

  16. while($count < 10){

  17.  print $count;

  18.  $count++;

  19. }

  20. #for循环

  21. for($count = 0; $count < 10; $count++){

  22.  print "$count\n";

  23. }

  24. #foreach循环

  25. @dessert = ("ice cream", "cake", "pudding", "fruit");

  26. foreach $choice (@dessert){

  27.  echo $choice;

  28. }

循环控制: last 可以跳出循环,类似于 break nect 跳过本次循环,类似于 continue

子例程:子例程是Perl中的称呼,实际就是函数,子例程定义方式见一下示例。

 
   
   
 
  1. #定义子例程

  2. sub is_leap_year{

  3.  my $year = shift(@_);  #@_中含有传递给这个函数的参数,shift取出第一个参数。

  4.  return (($year % 4 == 0) && ($year % 100 != 0)) || (($year % 400 == 0) ? 1 : 0);

  5. }

  6. #调用子例程

  7. $my_year = 2000;

  8. is_leap_year($my_year);

文件处理:Perl函数提供了open函数用于打开文件,也提供了pipe用于读写、追加文件内容。

'<' 意思是读 '>' 意思是写 '>>' 意思是追加写入 '+<' 意思是先读后写 '+>' 意思是先写后读

 
   
   
 
  1. #打开aa.txt文件

  2. open(FH, "<aa.txt") or die "Can't open file: $!\n";

  3. #一行一行读取文件内容,并打印到屏幕上

  4. while(<FH>){

  5.  print;

  6. }

  7. #一次读取全部内容并打印

  8. @lines = <FH>;

  9. print "@lines\n";

  10. #将数据写入aa.txt文件

  11. open(FH, ">aa.txt") or die "Can't open file: $!\n";

  12. print FH "This line is written to the file.\n";

  13. #检查文件的属性

  14. $file = 'aa.txt';

  15. print "File is readable, writeable, and executable\n" if -r $file and -w $file and -x $file;

管道:管道用于把操作系统输出内容作为输入流传送给Perl,或者将Perl的输出内容转发给系统命令以作为其输入。如果 | 出现在命令之前,表示该命令将perl的输出作为输入。

 
   
   
 
  1. #读取操作系统的ls命令执行后的输出,并打印

  2. open(F, "ls |") or die;

  3. while(<F>){

  4.  print;

  5. }

  6. #操作系统读取print的输入并进行排序

  7. open(SORT, "| sort") or die;

  8. print SORT "dogs\ncats\nbirds\n";

正则表达式:Perl作为擅长的一项,正则的规则需要单独学习。

 
   
   
 
  1. #判断是否匹配

  2. $_ = "hello world, WORLD, world";

  3. print if /he/;

  4. #将world替换为lanxi,值替换第一个world,结果为:hello lanxi, WORLD, world

  5. $str = "hello world, WORLD, world";

  6. $str =~ s/world/lanxi/;

  7. print $str;

  8. #忽略大小写,全部替换,结果为:hello lanxi, lanxi, lanxi

  9. $str = "hello world, WORLD, world";

  10. $str =~ s/world/lanxi/ig;

  11. print $str;

  12. #e会进行计算,结果为:He give me 42 dollars.

  13. $str = "He give me 5 dollars.";

  14. $str =~ s/5/6*7/e;

  15. print $str;  

在命令行下传送参数:Perl通过@ARGV数组保存了命令行提供的参数内容。

 
   
   
 
  1. #命令行输入的内容

  2. $ perl text.l aa bb cc

  3. #脚本内容

  4. print "@ARGV\n"; #输出: aa  bb cc

  5. #如果 aa,bb,cc是文件的名称,以下代码会打开文件,并且打印到屏幕上

  6. while(<ARGV>){

  7.  print;

  8. }

 
   
   
 
  1. #标量,数组和散列

  2. $age = 25;

  3. @siblings = qw("Nick", "Chet", "Dolly");

  4. %employee = (

  5.  "name" => "Jessica",

  6.  "phone" => "12345",

  7.  "position" => "CEO"

  8. );

  9. #获取他们的引用

  10. $pointer1 = \$age;

  11. $pointer2 = \@siblings;

  12. $ponter3 = \%employee;

  13. #使用引用

  14. print $$pointer1; # 25

  15. print @$pointer2; #Nick Chet Dolly

  16. print %$pointer3;

  17. print $pointer2->[1]; #Chet

  18. print $pointer3->{'name'}; #Jessica

对象:Perl中的对象是一种特殊类型的变量,一个类代表着含有一组变量与函数的一个包。

 
   
   
 
  1. #创建一个对象

  2. package Person;

  3. sub new

  4. {

  5.    my $class = shift;

  6.    my $self = {

  7.        _firstName => shift,

  8.        _lastName  => shift,

  9.        _ssn       => shift,

  10.    };

  11.    # 输出用户信息

  12.    print "名字:$self->{_firstName}\n";

  13.    print "姓氏:$self->{_lastName}\n";

  14.    print "编号:$self->{_ssn}\n";

  15.    bless $self, $class;

  16.    return $self;

  17. }

  18. sub setFirstName {

  19.    my ( $self, $firstName ) = @_;

  20.    $self->{_firstName} = $firstName if defined($firstName);

  21.    return $self->{_firstName};

  22. }

  23. sub getFirstName {

  24.    my( $self ) = @_;

  25.    return $self->{_firstName};

  26. }

  27. #使用该对象

  28. use Person;

  29. $object = new Person( "小明", "王", 23234345);

  30. # 获取姓名

  31. $firstName = $object->getFirstName();

  32. print "设置前姓名为 : $firstName\n";

  33. # 使用辅助函数设置姓名

  34. $object->setFirstName( "小强" );

  35. # 通过辅助函数获取姓名

  36. $firstName = $object->getFirstName();

  37. print "设置后姓名为 : $firstName\n";

其他

库和模块:库文件都带有.pl扩展名,而模块则拥有 .pm 扩展名。 库的路径:@INC数组负责保存一组标准Perl库的路径列表。 导入外部文件:如需要导入某个外部文件,应使用require或者use关键字。

 
   
   
 
  1. require("getopts.pl"); #导入getopts.pl文件

  2. use CGI; #使用CGI.pm 模块

诊断模式:如需在Perl脚本退出时获得出错原因等信息,用户可以使用内建的的die函数或者exit函数。

 
   
   
 
  1. open(FH, "filename") or die "Couldn't open filename: $!\n";

  2. if($input !~ /^\d+$/){

  3.  exit(1);

  4. }

use warnings; 提供警示信息,但不退出程序 use diagnostics; 提供详细的警示信息,但不退出程序 use strict; 检查全局变量,无引号单词等内容 use Carp; 与die函数类似,但能提供更多程序出错信息

关于小试机


以上是关于Perl语言概览的主要内容,如果未能解决你的问题,请参考以下文章

perl中的队列

Swift语言概览

Perl 5.20.0 发布

从其他语言(如 Java、PHP、Perl、Python 等)调用 C/C++ 代码的最佳方法是啥?

02 Apache Solr: 概览 Solr在信息系统架构中的位置

perl语言