Perl脚本编程

article/2024/12/23 13:43:46

Perl脚本学习笔记

文章目录

  • Perl脚本学习笔记
  • 一、编写你的第一个Perl程序
  • 二、Perl的基本构件
    • 1.直接量
    • 2.标量变量
    • 3.表达式和运算符
  • 三、控制程序流
    • 1.if 语句
    • 2.while 循环
    • 3.for 循环
  • 四、列表与数组
    • 1.列表
    • 2.数组
    • 3.遍历数组
    • 4.数组排序
  • 五、文件操作
    • 1.打开文件
    • 2.读取文件
    • 3.写入文件
  • 六、模式匹配
    • 1.元字符
    • 2.字符类
    • 3.分组和选择
    • 4.位置通配符
    • 5.替换
    • 6.连接运算符
    • 7.grep函数
  • 七、哈希结构
    • 1.将数据填入哈希结构
    • 2.从哈希结构中取出数据
    • 3.列表与哈希结构
    • 4.关于哈希结构的补充说明
  • 八、函数
    • 1.子例程
    • 2.参数
    • 3.作用域
  • 总结


一、编写你的第一个Perl程序

#!/usr/bin/perl -w
#-w 可以报错
print "Hello, World!\n";

常用的扩展名是.pl或.plx,运行hello.pl,执行perl hello.pl


二、Perl的基本构件

1.直接量

Perl拥有两种不同类型的标量常量,它们都称为直接量。一种是数字直接量,一种是字符串直接量。
数字直接量都是一些数字,Perl可以接受若干种不同的数字写法。
在这里插入图片描述
给字符串加引号有两种主要方法,一种是使用单引号(’ '),一种是使用双引号(" ")。
差别是使用单引号的字符串含义是非常直观的,单引号字符串中的每个字符就是表示它自己的含义。在双引号中的字符串中,Perl要查看是否存在变量名或转义字符。
perl还提供了另一个引号机制,即qq和q运算符分别代替双引号和单引号。

qq(I said , "Go then," and he said "I'm gone")
q(Tom's kite wedged in Sue's tree)

2.标量变量

若要将标量数据存放在Perl中,必须使用标量变量。在 Perl中,如果要写一个标量变量,可以写一个美元符号,后跟变量的名字。
$a

3.表达式和运算符

在这里插入图片描述
字符串运算符
并置运算符用圆点来表示(.)

#!/usr/bin/perl
$a="Hello,World";
$b=" Nice to meet you";
$c=$a . $b;
print "$c\n";

执行结果:
在这里插入图片描述
重复运算符x
运算符x配有两个参数,一个是要重复的字符串,另一个是该字符串重复的次数。

#!/usr/bin/perl
$line= "-" x 7
print "$line\n";

执行结果:
在这里插入图片描述
单参数运算符
在这里插入图片描述
递增和递减

$counter++;
$counter--;

尖括号运算符
尖括号运算符(<>),也称菱形运算符,主要用于读写文件。
< STDIN >表达式返回从键盘读取的这行信息

#!/usr/bin/perl
print "What size is your shoe?";
$size=<STDIN>;
print "Your shoe size is $size,Thank you";

< STDIN>表达式从键盘读取信息,直到用户按下 E n t e r键为止。整个输入行返回,并被存放在$size中。由< STDIN >返回的文本行也包含用户键入的换行符(因为按下了 Enter键) 。在大多数情况下,你不希望在字符串的结尾处出现换行符。若要删除换行符,可以像下面这样
使用chomp运算符:

print "What size is your shoe?";
$size=<STDIN>;
chomp $size;
print "Your shoe size is $size, Thank you";

数字关系运算符
在这里插入图片描述
字母关系运算符
在这里插入图片描述
逻辑运算符
在这里插入图片描述
文件测试运算符
在这里插入图片描述


三、控制程序流

1.if 语句

单if语句
适用范围:只需要一步判断,条件返回真干什么或者条件返回假干什么

if (condition) {commands;
}

if-else 语句
适用范围:两步判断,条件为真干什么,条件为假干什么

if (condition) {commands1;
} else {commands2;
}

多重判断

if (condition1) {commands1;
} elsif (condition2) {commands2;
} else {commands3;
}

2.while 循环

只要表达式是真的,while循环就会重复执行该代码段

while (condition) {commands;
}

3.for 循环

for (变量;条件;自增自减运算) {commands;
}

明细控制
除了使用语句块、for、while 、if以及其他流控制语句来控制代码块以外,还可以使用Perl语句来控制语句块中的流程。
last语句能够使当前正在运行的最里面的循环块退出。

#!/usr/bin/perl
$i=0;
while ($i<15) {last if ($i==5);$i++;print "$i\n";
}

执行结果:
在这里插入图片描述
last 语句能够在$i的值是5时使while循环退出,而不是在通常 while测试的结果是假时退出。当你拥有多个嵌套的循环语句时, last 将退出当前正在运行的循环。
next****语句使得控制权被重新传递给循环的顶部

#!/usr/bin/perl
for ($i=0;$i<100;$i++) {next if (not $i%2);print "An odd number= $i\n";
}

执行结果:
在这里插入图片描述
该循环将输出从 0到98之间的所有奇数。如果 $ i是偶数,那么 next语句将使该循环通过它的下一个迭代运行过程。
标号
Perl允许你给语句块和某些循环语句( for、while)加上标号。也就是说,可以在语句块或语句的前面放置一个标识符:

OUTER: while ($expr) {INNER: while($expr) {statement;}
}

last、redo和next语句都可以带有一个标号,作为参数,这样就可以退出一个特殊的语句块。
exit语句是最后的一个流控制工具。当perl遇到exit语句时,程序就停止执行,perl将一个退出状态返回给操作系统。


四、列表与数组

1.列表

列表的语法是用一组括号将一些标量值括起来

(5, 'appel', $x, 3.14);

qw运算符,列表每个元素用白空间隔开

qw (5 apple $x 3.14);

范围运算符由一对圆点来表示

#1~10之间的数列
(1..10);

2.数组

#!/usr/bin/perl -w 
#-w 可以报错
@boy=qw(Greg Peter Bobby);
@girl=qw(Marcia Jan Cindy);
@kids=(@girl, @boy);
print "@kids\n";

执行结果:
在这里插入图片描述
从数组中取出元素

#!/usr/bin/perl -w 
@boy=qw(Greg Peter Bobby);
print $boy[0];//输出Grep
print $boy[1];//输出Peter
print $#boy;//输出2
#获得数组的大小
$size=@boy;
print $size;//输出3
print scalar(@boy);//输出3

3.遍历数组

#!/usr/bin/perl -w
@boy=qw(Greg Peter Bobby);
for($index=0;$index<@boy;$index++){
print "My favorite is $boy[$index]\n"
}
#!/usr/bin/perl -w
@boy=qw(Greg Peter Bobby);
foreach $b (@boy){print "My favorite is $b\n"
}

执行结果:
在这里插入图片描述
将标量转换成数组的方法之一是使用split函数。
Split函数拥有一个模式和一个标量,并且使用该模式来分割该标量

@worlds=split(//,"The quick brown fox");

执行结果:
在这里插入图片描述

将数组转换成标量使用join函数

$number=join(',',(1..10));

执行结果:
在这里插入图片描述

4.数组排序

sort函数将一个列表作为它的参数,并且大体上按照字母顺序对列表进行排序,然后该函数返回一个排定顺序的新列表。

#!/usr/bin/perl -w
@boy=qw(Greg Peter Bobby);
print join(' ',sort @boy);

执行结果:
在这里插入图片描述
reverse函数能够对字符串的字符进行倒序操作,返回倒序后的字符串。

#!/usr/bin/perl -w
@boy=qw(Greg Peter Bobby);
print join(' ',reverse @boy);

执行结果
在这里插入图片描述


五、文件操作

1.打开文件

open函数用于打开文件,句法如下:

open(filehandle,pathname) || die

open函数将文件句柄作为它的第一个参数,将路径名作为第二个参数。路径名用于指明要打开哪个文件。
这一行代码可以读作“打开或撤消”,它有时表示你想要让程序如何处理没有打开的文件。如果 open运行没有成功,也就是说它返回 FALSE,那么逻辑 OR(||)必须计算右边的参数(die);如果open运行成功了,也就是说它返回TRUE,那么就不要计算die的值。
close 函数关闭句柄
当完成文件句柄的操作后,将文件句柄关闭,这是个很好的编程习惯。
打开file.txt文件,当试图打开没有设定目录名的文件名时,Perl假定该文件是在当前目录中。若要打开位于另一个目录中的文件,必须使用路径名。

#!/usr/bin/perl -w
open(MYFILE, "/home/liuy/Scripts/perl/file.txt") || die
close (MYFILE)

特殊变量 $! ,在字符串上下文中,返回来自你的操作系统的相应出错消息。

#!/usr/bin/perl -w
open(MYFILE, "/home/liuye/Scripts/perl/file1.txt") || die "$!";
close (MYFILE)

执行结果:
在这里插入图片描述

2.读取文件

使用文件输入符 < >
若要读取文件句柄,只需要将文件句柄放入尖括号运算符中,将该值赋予一个变量。

#!/usr/bin/perl -w
open(MYFILE, "/home/liuye/Scripts/perl/file1.txt") || die "$!";
$line=<MYFILE>;
close (MYFILE);
print $line;

3.写入文件

open(filehandle,">pathname") //改写
open(filehandle,">>pathname") //追加

写入操作

print filehandel LIST

filehandel是要将数据写入到的文件句柄, LIST是要写入的数据的列表

#!/usr/bin/perl -w
open(MYFILE, ">>/home/liuye/Scripts/perl/file.txt") || die "$!";
@contents=qw(this is a cat);
print MYFILE @contents;
close (MYFILE);

六、模式匹配

简单的模式匹配运算符m/ /

1.元字符

. 圆点用于匹配除了换行符外的任何单个字符
\ 在字符前面加上一个反斜杠,使它失去“元”的含义
+ 用于使前面的字符与后面的字符至少匹配一次
* 前面的字符可以进行 0次或多次匹配
? 用于使前面的字符进行 0次或一次匹配
.* 用来匹配任何东西
{n,m}  根据需要的具体次数进行匹配,n是匹配的最小次数,m是匹配的最大次数/x{5,10}/ x至少出现5次,但是不超过1 0/x{9, }/ x至少出现9次,也可能出现更多次
/x{0,4}/ x最多出现4次,也可能根本不出现
/x{8}/ x必须正好出现8

2.字符类

若要编写一个字符类,可以用方括号[ ]将这些字符括起来,在字符类中,大多数通配符会失去它们的“通配符性质”,因此,* 实际上代表一个普通的字符。
在这里插入图片描述
如果插入记号( ^)作为字符类中的第一个字符,该字符类将变为无效

/[^A-Z]/ 匹配不在A-Z的任意字符

3.分组和选择

当可能的匹配项之间用一个 | 字符隔开时,正则表达式中就出现了选择

#这个字符串包含dogs还是cats
if (/dogs|cats/) {
print "\$_ contains a pet\n";
}
可以对括号进行嵌套,使一个组中包含另一个组
/(fl|b|fl|cl)og/

4.位置通配符

第一个位置通配符是插入记号( ^
与它相对应的通配符是美元符号( $

5.替换

替换运算符 s / / /

s/search/replace/

6.连接运算符

连接运算符 = ~
如果要对非 $ _的变量使用匹配运算符和替换运算符,则必须将它们与该变量连接起来

$weight="185 lbs";
$weight=~s/lbs//;

7.grep函数

grep搜索数组,寻找某些模式
grep不一定必须与模式匹配或替换运算符一道使用,它可以与任何运算符一道使用,下面这个例子用于检索长度超过 8个字符的犬名

#!/usr/bin/perl -w
@dogs=qw(greyhound blooshound terrier mutt chihuahua);
@hounds=grep /hound/, @dogs;
@longdogs= grep length($_)>8, @dogs;
print "@hounds\n";
print "@longdogs\n";

执行结果:
在这里插入图片描述


七、哈希结构

哈希是Perl中的第三种基本数据类型。与数组一样,哈希包含了许多个标量。数组与哈希的差别是:哈希是按照名字来访问它们的标量的,而不是像数组那样使用数字标号进行访问。
哈希元素包含两个部分,即一个关键字和一个。关键字用于标识哈希的每个元素,而值则是与该关键字相关的数据。这种关系称为关键字值对

1.将数据填入哈希结构

哈希变量是以百分比符号(%)来标识的。
若要创建哈希元素,只需要将值赋予这些元素即可,这与创建数组的元素很相似。

$food{'apple'}='fruit';//关键字是apple,值是fruit
$food{'pear'}='fruit';

P e r l有一个特殊的运算符,称为逗号箭头运算符,即 =>。使用=>运算符,同时利用Perl忽略白空间的特性,就能够编写下面这样的哈希结构的初始化代码。

%food=(key1 => 'value1',key2 => 'value2');

2.从哈希结构中取出数据

key函数来检索作为列表返回的哈希结构的所有关键字。
若要输出该哈希结构中的所有电影名字,可以使用下面的代码:

foreach $film (keys %Movies){print "$film\n";
}

values函数来检索哈希结构中存放的所有值。

foreach $film (values %Movies){print "$film\n";
}
@Directors=values %Moves;
@Films=keys %Moves;

3.列表与哈希结构

若要拷贝一个哈希结构,只需要像下面这样将这个哈希结构赋予另一个哈希结构即可:

%New_Hash=%Old_Hash;

当你将 % Old_Hash置于哈希初始化代码的右边时( Perl通常希望右边是个列表或数组),Perl便将哈希结构转换成一个列表。可以像处理列表那样,将几个哈希结构组合起来并对它进行操作。

%Both=(%First,%Second);
%Additional=(%Both,key1 => 'value1',key2 => 'value2' );

4.关于哈希结构的补充说明

exists函数可以用于测试哈希结构中是否存在哈希关键字,如果存在,便返回真,否则返回假。

if (exists $Hash{keyval}) {:
}

delete函数删除单个哈希关键字。

delete $Hash{keyval};

若要从哈希结构中删除所有关键字和值,只需要将哈希结构初始化为一个空的列表即可。

%Hash=();

八、函数

在 Perl中,用户定义的函数称为子例程。与 Perl的内置函数一样,用户定义的函数也可以拥有参数,并且可以将值返回给调用者

1.子例程

sub function_name {statement;
}
#调用子例程
&function ();
或
function ();

子例程的返回值是子例程中计算的最后一个表达式的值,或者是return语句显式返回的值。

2.参数

若要传递子例程的参数,可以使用下面任何一个语句。

subname (arg1, arg2, arg3);
&subname (arg1, arg2, arg3);
subname arg1, arg2, arg3;

只有当Perl已经遇到子例程的定义时,才能使用上面不带括号的第三种参数形式。
在子例程中,被传递的参数可以通过Perl的特殊变量 @_ 来访问。

sub printargs{print join(',', @_);
}
printargs('market', 'home', 'roast');

若要像下面这个例子中那样,访问传递过来的各个参数,可以使用数组 @ _上的下标。 $ _ [0] (@_的一个下标)与标量 $ _毫不相干:

sub print_third_argument {print $_[2];//取第三个参数
}

3.作用域

my操作符,使变量成为函数的专用变量。

sub moonweight {my $weight;($weight)=@_;return ($weight/1.66667);
}

Perl语句use strict,它能够激活更严格的 Perl,使你能够避免在编程中出现错误。


总结

参考文献:Perl编程24学时教程


http://chatgpt.dhexx.cn/article/5I4gyMTd.shtml

相关文章

71.区分异步和多线程应用场景

初学者有时候会将异步和多线程混为一谈。如果对它们之间的区别不是很清楚&#xff0c;很容易写出下面这样的代码&#xff1a; private void buttonGetPage_Click(object sender, EventArgs e) { Thread t new Thread(() >{ var request HttpWebRequest.Create(&q…

多线程的简单实现和应用场景

main方法测试&#xff0c;定义for循环造假数据&#xff0c;定义time在方法结束后时间相减获取执行毫秒数&#xff0c;单线程跟多线程对比执行时间。 上图 我定义了2000000的数据量&#xff0c;可以看到单线程执行时间为6520毫秒&#xff0c;多线程&#xff08;3个&#xff09;执…

多线程的创建方式及多线程应用场景

本篇大概详解思路如下思维导图: 目录 在java程序中创建线程 start()和run()的区别 start()方法为啥不能被重复调用 创建线程的7种方式 多线程提高速度 多线程的使用场景 在java程序中创建线程 我们知道一个进程包括多个线程(pcb---每个线程对应一块pcb,一个进程包括多个p…

Java多线程的应用场景和应用目的举例

微信公众号&#xff1a;javafirst 01 通俗的解释一下多线程 多线程用于堆积处理&#xff0c;就像一个大土堆&#xff0c;一个推土机很慢&#xff0c;那么10个推土机一起来处理&#xff0c;当然速度就快了&#xff0c;不过由于位置的限制&#xff0c;如果20个推土机&#xff0…

多线程的使用场景

多线程的使用 使用线程池ExecutorService &#xff0c;exe.execute来开始线程&#xff0c;thread,runabble,callabble都可以&#xff0c;isTerminated来判断线程池的线程是否都执行完毕 Testpublic void testThread() throws InterruptedException {//创建线程池ExecutorServi…

【多线程/线程池】项目中实际应用场景

场景一、快速响应用户的请求 描述: 用户发起的实时请求&#xff0c;服务追求响应时间。比如说用户要查看一个商品的信息&#xff0c;那么我们需要将商品维度的一系列信息如商品的价格、优惠、库存、图片等等聚合起来&#xff0c;展示给用户。 场景二、快速处理批量的任务 描…

多线程相关实例(多线程经典应用场景)

转载&#xff0c;from 网络&#xff0c;未能找到原创人员&#xff0c;只找到一个转载 https://blog.csdn.net/u013521220/article/details/79648270 多线程实例目录 相关知识&#xff1a;经典案例一&#xff1a;三个售票窗口共同出售20张票经典案例二&#xff1a;AB两人共用一个…

多线程的实现和使用场景

多线程的实现和使用场景 一、多线程实现方式1.1 Thread实现1.2 Runnable实现 二、多线程的使用场景1.多线程使用场景1.1 多线程应该最多的场景&#xff1a;1.2多线程的常见应用场景&#xff1a; 2.多线程小案列2.1 多线程计算2.2 多线程实现卖票小程序2.3多线程卖票小程序优化2…

子网掩码、网关及网络号与主机号的区分与计算

前言&#xff1a; 当前使用的IP地址有4个字节&#xff08;32bit&#xff09;组成&#xff0c;即IPV4编码方式。每个IP地址包括两部分&#xff1a;网络号和主机号。当分配给主机号的二进制位越多&#xff0c;则能标识的主机数就越多&#xff0c;相应地能标识的网络数就越少&…

计算机网络之ip、子网掩码、网络号、主机号等概念解析

在工作中谈论到计算机网络时&#xff0c;有几个经常出现的术语&#xff0c;比如&#xff1a;ip、子网掩码、网段等等。之前对这些概念的理解都比较模糊&#xff0c;只知其大概意思&#xff0c;随着工作中遇到的网络问题越来越多&#xff0c;有必要详细理解一下计算机网络的基础…

IP地址、子网掩码、网络号、主机号、网络地址、主机地址以及ip段/数字-如192.168.0.1/24是什么意思?

背景知识 IP地址 IP地址被用来给Internet上的电脑一个编号。大家日常见到的情况是每台联网的PC上都需要有IP地址&#xff0c;才能正常通信。我们可以把“个人电脑”比作“一台电话”&#xff0c;那么“IP地址”就相当于“电话号码”&#xff0c;而Internet中的路由器&#xff0…

若尔当型状态空间方程的能控能观判断

若尔当型状态空间方程的能控能观判断 对于若尔当型状态空间方程&#xff1a; 能控充要条件&#xff1a;当且仅当同一特征值对应的每个若尔当块的最后一行对应B矩阵的行向量线性无关。 注:每个特征值均应满足以上条件。 能观充要条件&#xff1a;当且仅当同一特征值对应的每个…

状态空间方程的能控性与能观性判断

状态空间方程的能控性与能观性判断 能控性判断方法 对于状态空间方程&#xff0c;判断是否能控。 注&#xff1a;由于输出在能控性方面不起任何作用&#xff0c;因此在能控性研究中忽略输出方程。 矩阵对任意t>0均非奇异。的“能控性矩阵”行满秩。的矩阵在A的任一特征值…

Matlab:传递函数(含迟延环节)/状态空间方程/z传递函数的构造/运算/转化

1、传递函数 1.1 构造传递函数 &#xff08;1&#xff09; Matlab可以这样构造上式 num[10 30 20]; den[1 12 47 60]; sysctf(num,den) 运行结果 &#xff08;2&#xff09; 根据零极点构造表达式&#xff1a; z[-1 -2]; p[-3 -4 -5]; k10; sysczpk(z,p,k) 运行结果&…

【电机/鼠笼型感应电机】IM模型建立、坐标变换、状态空间方程推导

目录 一、感应电机三相数学模型 1.1 磁链方程 1.2 电压方程 1.3 转矩方程和运动方程 二、坐标变换 2.1 原理 2.2 Clarke变换和逆变换 2.3 Park变换和逆变换 三、感应电机两相数学模型 . 3.1 αβ坐标系中 3.2 dq坐标系中 四、感应电机状态方程 4.1 状态变量的选择 …

c语言 状态空间控制方程,MPC学习笔记1:基于状态空间模型的预测控制(2)

基于估计的无约束预测控制 1.引言 基本上这两个部分都是在线性理论的框架下,利用状态空间法来建模、求解控制律。状态空间模型在理论分析上具有很强的优越性,但实际应用中能直接准确且经济地获取系统状态并不容易。有些状态,尤其是温度(如火箭喷口温度等)只能间接估计,因此…

控制建模matlab练习02:状态空间方程系统

此建模从一个简单的系统&#xff1a;弹簧质量阻尼系统&#xff0c;来学习状态空间方程系统。 m是质量&#xff1b;b是阻尼系数&#xff1b;k是弹簧系数。 此系统的状态空间方程&#xff0c;如下图&#xff1a; 01新建脚本&#xff08;.m文件&#xff09; 我们在matlab主页&a…

卡尔曼滤波(Kalman Filtering)——(3)数据融合 状态空间方程

数据融合 协方差 状态空间方程 观测器 一、数据融合假设举例公式推导过程再次理解 二、状态空间方程阻尼滑块模型1、连续表达式2、离散表达形式3、符号含义 参考文献 一、数据融合 假设举例 假设测量一物体的质量&#xff0c;现在有两个测量设备但是都存在误差且误差服从正态分…

[现代控制理论]2_state-space状态空间方程

[现代控制理论]11_现代控制理论串讲_完结_pdf获取 [现代控制理论]10_可观测性与分离原理_观测器与控制器 [现代控制理论]9_状态观测器设计_龙伯格观测器 [现代控制理论]8.5_线性控制器设计_轨迹跟踪simulink [现代控制理论]8_LQR控制器_simulink [现代控制理论]7_线性控制器设计…