前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Perl快速入门学习

Perl快速入门学习

作者头像
全栈工程师修炼指南
发布2022-09-28 21:33:09
1.3K0
发布2022-09-28 21:33:09
举报
文章被收录于专栏:全栈工程师修炼之路

[TOC]

快速入门

Perl 是 Practical Extraction and Report Language 的缩写”实用报表提取语言”是一种功能强大功能丰富的脚本编程语言,最初的设计者为拉里·沃尔(Larry Wall)诞生于20世纪80年代末期并由他不断更新和维护的编程语言。

其思想借用了C、sed、awk、shell脚本以及很多其他编程语言的特性,所以它的文本处理能力是及其强大的是关于Web处理中最常用使用的工具;

优点和特点:

  • Perl是高级、通用、直译式、动态、灵活的程序脚本语言(不需要编译器和链接器来运行代码)
  • Perl跨平台性 Dos/windows,MacOS,OS/2,VM2和Unix
  • Perl语言直接提供泛型变量、动态数组、Hash表等更加便捷的编程元素,提供了许多冗余语法。
  • Perl最重要的特性是Perl内部集成了正则表达式的功能,以及巨大的第三方代码库CPAN可扩展性强
  • Perl提供了许多其他紧凑的数据处理结果(data-handling contructs),能够减少所需的”简单重复的劳动”,把更多的精力放在程序设计和正则表达式上;
  • Perl的mod_perl 的模块允许 Apache web 服务器使用 Perl 解释器。

_缺点_:

  • Perl程序可以写得很随意因为Perl的灵活性和”过度”的冗余语法,也因此获得了仅写(write-only)的”美誉”
  • Perl程序的代码令人难以阅读,实现相同功能的程序代码长度可以相差十倍百倍
  • perl进程某一时刻会占用很多的内存空间 建议的解决方法是在程序里使用use strict;以及use warnings;,并统一代码风格,使用库,而不是自己使用”硬编码”。Perl同样可以将代码书写得像Python或Ruby等语言一样优雅。
perl安装

描述:Perl的官网网站:http://www.perl.org/ ,目前Perl版本5.30.0;

WeiyiGeek.Perl

选择Unix中有两种版本:

Unix 和 Linux 安装 Perl:安装成功后Perl 的安装路径为/usr/local/bin,库安装在 /usr/local/lib/perlXX, XX 为版本号。

代码语言:javascript
复制
wget https://www.cpan.org/src/5.0/perl-5.30.0.tar.gz
tar -xzf perl-5.30.0.tar.gz
./Configure -de
make && make test && make install

WeiyiGeek.PerlInstall

接下来我们如果 perl -v 命令查看是否安装成功。

代码语言:javascript
复制
perl -v
This is perl 5, version 30, subversion 0 (v5.30.0) built for x86_64-linux
Perl语法基础

CMD语法:

代码语言:javascript
复制
perl5.26.2 [switches] [--] [programfile] [arguments]

Perl参数:

代码语言:javascript
复制
-e/E "Perl代码"  #直接执行代码
-l
-p #表示对目标文件的每一行进行查找和替换
-i #表示将替换的结果写回到文件之中
-w/W #warning 在程序执行可疑的地方发出警报

变量的声明使用与php相似都是采用$变量名称进行定义变量和调用变量;

代码语言:javascript
复制
#基础示例1
perl -e "print 'This is a Demo'"
This is a Demo

#示例2.命令行替换文件中的文本
perl -p -i -e 's/sysread/read/g' file.txt

#示例2.额外的功能
perl -w script.pl string.txt #string是要被提取的源文本

特殊变量

  • $/ 特殊变量能使用一种神奇的方式,让<>不再返回单行文字,而是返回或多或少的一段文件。返回的数据任然是一个字符串,只是这个字符串可能包含多个逻辑行;
Perl数据类型:
  • 数值
  • 字符串
  • 数组
  • Hash(哈希)
代码语言:javascript
复制

注意事项:

  • Perl通常情况是不区分整数和浮点数;
Perl运算操作符:
  • 赋值
  • 判断
  • 逻辑 (and / or / not)
  • 其他操作符号
    • <> 每次读取一行数据相当于其他语言中的getline()函数.注意不要混淆操作符<>与shell的重定向符号>或者是Perl的大小于号;
代码语言:javascript
复制

#读取每一行数据
while($line = <>) {
  #处理$line
}

基础示例1:

代码语言:javascript
复制
#!/usr/bin/perl
# Function:计算华氏温度和摄氏温度
$celsius = 30;
$fahrenheit = ($celsius * 9 / 5) + 32;
print "$fahrenheit F, And $celsius ℃\n";

执行结果:

代码语言:javascript
复制
perl demo1.pl
86 F, And 30 ℃

注意事项:

  • (1)Perl符号=~ / = 和 \=\= 之间的差别,等于 \=\=测试两个数字是否相等, = 用来给变量赋值,而=~用来连接正则表达式m/.../和待搜索的目标字符串
Perl控制结构
代码语言:javascript
复制
#条件结构
if(条件){
  ...
}else if(条件){
 ...
}else{
  ...
}

#循环结构
while()
{
  last; #停止while循环内的处理跳出循环
}

Perl也提供与其他流行语言类似的控制结构:

基础示例2:

代码语言:javascript
复制
#!/usr/bin/perl
#FUNCTION: 实现判断语句与while循环
$num1 = 1024;
$num2 = 1;
$sum = 0;

if( $num1 != "" && $num2 != "" )
{
  $add = $num1 + $num2;
  print "$num1 + $num2 = $add\n";
}

while($num <= 100)
{
  $sum = $sum + $num;
  $num++;
}

print "1+..+3+...+7+100 = $sum \n";

执行结果:

代码语言:javascript
复制
perl demo2.pl
1024 + 1 = 1025
1+..+3+...+7+100 = 5050

Perl正则表达式

描述:perl和Egrep属于同一个流派,Perl支持Regex的一些修饰符的使用并且Perl正则表达式中的元字符更多;

代码语言:javascript
复制
$variable=~ m/regularExpression/i #来判断一个正则表示是是否能匹配某个字符串;
#整个测试语句作为一个单元返回boolean类型返回TRUE或者FALSE;
m #表示进行整治match匹配;
s #表示进行替换replace操作
/ #斜线表示正则表达式的边界;
/i #该修饰符modifier表示不区分大小写匹配
/g #该修饰符表示全局匹配(global Macth)
/x #表示宽松排列的表达式(free-from expressions)允许我们重新编排这个表达式(大多空白字符会被忽略),增强可读性;
/m #增强的行瞄点(enhanced line anchor),^$将切换到逻辑行模式;
  1. Perl提供例如许多简洁的元字符:
  • \cx 匹配由X指明的控制字符
  • \n : 换行符
  • \f : ASCII 进制符号
  • \t : tab键符号
  • \b : 退格键
  • \v : 垂直制表符
代码语言:javascript
复制
$ perl -E 'if("a\nb\tc" =~ m/\cI|\n/){print "匹配成功"}'
匹配成功
$ perl -E 'if("a\nbc" =~ m/\cI|\n/){print "匹配成功"}'
匹配成功

Perl支持捕获括号()我们叫元组与非捕获类型括号(?:...)表示只分组不补捕获;

代码语言:javascript
复制
() #元组匹配成功之后Perl可以用$1 $2 $3 之类的变量来保存相对应的()括号内的子表达式匹配的文本;
(?:....)

注意事项:

  • 在元组中子表达式的编号安装开括号的出现先后排序,从1开始子表达式可以嵌套例如(Washington(.DC)?)
  • 如果只是希望分组,也可以使用()但副作用是他们捕获的文本任然会保存在特殊的变量之中;

3.Perl正则中的环视功能

代码语言:javascript
复制
(?=pattern) #肯定型顺序环视(positive lookahread)(从左向右)  正向预查(能匹配pattern)
#例如(?=\d)表示如果当前位置 右边字符 是数字则匹配成功;
#例如'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。

(?!=pattern) #否定型顺序环视(negativ lookahread)(从左向右)  负向预查(不能匹配pattern)
#例如(?!=\d)表示如果当前位置 右边字符 不能是数字则匹配成功;
#例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 

(?<=pattern) #肯定型逆序环视(从右向左)查看文本 反向肯定预查与正向肯定预查类似,只是方向相反。注意空格
#例如(?<=\d)表示如果当前位置 左边字符 是数字则匹配成功;(?<=19)99 则匹配1999后面的99
#例如Windows( ?<=95|98|NT|2000|10)能匹配“98/NT/2000/10/Windows”中的“Windows”,但不能匹配“95Windows”中的“Windows”,软件不一定全部支持
perl -l -e '$str="Windows2000  95Windows  2000Windows Windows95";if($str =~ s/Windows( ?<=95|98|NT|2000|10)/NOW/g){print "匹配成功 $str"}'
# 匹配成功 NOW  95Windows  2000Windows Windows95

(?<!pattern) #肯定型逆序环视(从右向左)查看文本;
#例如(?<!\d)表示如果当前位置 左边字符 不能是数字则匹配成功;(?<!19)99 则匹配非1999后面的99,比如这时匹配2099中的99
#例如Windows( ?<!95|98|NT|2000|10)能匹配“95Windows”中的“Windows”  不能匹配“98/NT/2000/10/Windows”中的“Windows”

Perl多种方式使用正则表达式: 基础示例1:

代码语言:javascript
复制
#!/usr/bin/perl
#function:验证Perl正则表达式进行匹配
#方式1:接受用户输入并且判断校验输入
print "Please Enter a number(Eg:1024):";
$demo = <STDIN>;  #交互式接收用户输入
chomp($demo);  #去掉$demo变量中输入的换行符
# 关键点:注意=~符号后的 m/,匹配成功返回true否则false
if ($demo =~ m/^[0-9]+$/) {
  print "only digits\n"
} else {
  print "not only digits\n"
}


#方式2:精确匹配整数负数以及小数
$demo =~ m/^[-+]?[0-9]+(\.[0-9]*)?$/) #^配置行首 $匹配结尾


#方式3:或者输入摄氏温度或者华氏温度进行转换
printf "Please input 86 F or 30 C:";
$value = <STDIN>;
chomp($value);

#第一个括号: 整个正则表达式保存位$1
#第二个括号: 保存是输入的华氏温度还是摄氏温度保存位$2
if($value =~ m/^([-+]?[0-9]+)([CF])$/)
{
  #重点
  $number = $1; #将输入温度数据保存到变量中
  $type = $2;  #将输入变量的类型保存到变量

  #判断字符串是否相等
  if($type eq "C"){
    $cel = $number;
    $fah = ($cel * 9 / 5) + 32;
  } else {
    $fah = $number;
    $cel = ($fah - 32) * 5 / 9;
  }
  #计算输入两个温度值采用printf函数(与C中函数类似)
  printf "%2.f C And %.2f F\n", $cel, $fah;
} else {
  print "Matching Error!"
}

执行结果:

代码语言:javascript
复制
[root@master perl]# perl demo3.pl
Please Enter a number(Eg:1024):1024bac
not only digits

[root@master perl]$perl -w demo4.pl
Please input 86 F or 30 C : 30C
30 C And 86.00 F

[root@master perl]$perlperl -w demo4.pl
Please input 86 F or 30 C : 86F
30 C And 86.00 F

[root@master perl]$perl -w demo4.pl
Please input 86 F or 30 C : 76F
24 C And 76.00 F

基础示例2:使用正则表达式修改文本 描述:Perl和其他许多语言提供的一个正则表达式特性:替换(substiution或者叫做查找和替换(search and replace))

代码语言:javascript
复制
#!/bin/perl
#替换修改文本
#示例1
$string = "this is a demo";
$string =~ s/is/test/gi; #或者直接在源字符上操作(全局替换)
print "$string";

$string = "this is a demo";
$string =~ s/\bis\b/test/i; #或者直接在源字符上操作(只替换一次)
print "$string";

##示例2.保留小数点后的两位
$iee = 12.375000392;
$iee =~ s/(\d+)(\.\d\d[1-9]?)\d*/$1$2/;
print "$iee ";

$iee = 37.500000000925;
$iee =~ s/(\d+)(\.\d\d[1-9]?)\d*/$1$2/;
print "$iee ";

执行结果:

代码语言:javascript
复制
$ perl replace.pl
thtest test a demo
this test a demo

12.375
37.5

基础示例3:

代码语言:javascript
复制
#示例1.再perl的cmd中需要对一些字符进行八进制代替比如 ' = \047 ,替换的时候也可以采用\0nm模式
perl -l -e '$str="Window\047s 98";if($str =~ s/\47/\057/g){print "匹配成功 $str"}'
匹配成功 Window/s 98

#示例2./x修饰符重新编排表达式
$text =~ s {
  \b
  (
    username
    \@
    hostname
  )
  \b
}{<a href="mailto:$1">$1</a>}gix

补充说明: 为什么有时候Perl在使用正则匹配的需要对$和@需要转义

  • $符号既可以作为字符串结束字符,又可以在Perl中作为标记变量;
  • @情况与之类似,Perl用@表示数组名,在Perl中的字符串或者正则表达式中也可以容许出现数组变量;如果需要使用@字符就需要进行转义避免把他作为数组名称;
perl内置函数
代码语言:javascript
复制
defined($var);  #验证变量是否定义
die "Error Exit!";   #类似于php中的die()函数发出错误信息
入坑解决

问题1.在编译perl源代码时候发生错误

代码语言:javascript
复制
perl: warning: Falling back to a fallback locale ("en_US.UTF-8")

#解决方法:
vim ~/.bashrc
export LC_ALL=en_US.UTF-8
. ~/.bashrc  #然后加载该环境变量
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-08-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 快速入门
  • perl安装
  • Perl语法基础
    • Perl数据类型:
      • Perl运算操作符:
        • Perl控制结构
        • Perl正则表达式
        • perl内置函数
        • 入坑解决
        相关产品与服务
        云服务器
        云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档