【perl】基本语法 /备忘录/

news2025/1/31 20:56:55




分享 perl 语言学习资源

Perl 教程|极客教程 (geek-docs.com)

Perl [zh] (runebook.dev)

Perl 运算符 | 菜鸟教程 (runoob.com)

Perl Documentation - Perldoc Browser

Search the CPAN - metacpan.org

当然还有一些经典书籍,不再列举。 


1、数字

1.1、数字表示

perl内部会把所有的数字当做浮点数进行处理。如果一个数字太长,可以使用下划线将数据分开,便于阅读。

与其他语言类似,支持整数的其他进制表示,十六进制0x,八进制0,二进制0b。

同样支持幂指数表示。

example:

$a = 1.23_456;#十进制
print "$a\n";

$b = 0xFF_FF;#十六进制
print "$b\n";

$c = 0377;#八进制
print "$c\n";

$d = 0b1101;#二进制
print "$d\n";

$e = 1.3e-3;#指数表示
print "$e\n";

result:

1.23456
65535
255
13
0.0013

1.2、数字操作符

基本的加减乘除运算,+ - * /

取模(求余)运算 % ,对于小数的求余 ,会将操作数的小数部分直接去掉(即,向下取整)然后再做求余运算,如 10.99 % 3 = 1。可以将操作数变为负数,如 -10.01 % -7 = -3;-10.01 % 7 = 4

指数运算符  ** ,如2**3 = 8。负数的非整数次方运算会产生复数,复数的运算需要Math::Complex 模块。

use Math::Complex;


# $cc = cplx(3,4);
$cc = 3+4*i;
print $cc**2 . "\n";

 Perl - Math::Complex [zh] (runebook.dev)

这个网址有很多中文的perl语法手册。 

2、字符串

2.1、单引号字符串

单引号里面的转义字符,只支持单引号和反斜线。其他字符均表示自身。

示例:

$s1 = 'asdf\'\\\n qwe
\twefff';
print $s1 ;

result:

asdf'\\n qwe
\twefff

2.2、双引号字符串

双引号字符串支持所有的转义字符。

example:

$s2 = "asdf\'\\\nashs\thjlidce12#\"";
print $s2;

result:

asdf'\
ashs	hjlidce12#"

perl中文教程:Perl 教程|极客教程 (geek-docs.com)

2.3、字符串操作符

. 可以将字符串前后连接。

x 可以将字符串复制粘贴,x后面的次数如果是小数,将小数向下取整后复制粘贴。

字符串和数字之间,perl 解释器会根据语境自动转换。

example:

print "HELLO WORLD " . "HELLO PERL" . "\n";# 字符串连接

print "hello perl \n" x 3;

print 3 x 10 . "\n";

print 1 x 3.99 . "\n";

print "A" . 3*8 . "\n";

result:

HELLO WORLD HELLO PERL
hello perl 
hello perl 
hello perl 
3333333333
111
A24

3、perl 内置警告

有几种使能警告的方式:

1、在终端运行时: perl -w perl_program.pl

2、 perl代码的第一行:#! /usr/bin/perl/ -w

3、perl代码的前面打开使能:use warnings;

如果不理解警告信息,可以使用诊断:use diagnostics;

4、标量变量

标量变量只能存放一个标量值。命名方式和其他语言不一样的是,变量名称由$符号后接标识符组成。标识符由数字、字母、下滑线组成,不可以由数字开头。

变量赋值几种方式:

1、单纯使用 = 赋值。

2、使用 += 、*=、 /=、 .=、 等。

字符串标量变量的内插(仅双引号有效):

$str1 = "12345678980";

$str2 = "You input $str1";#将str1插入str2

print $str2;

$str3 = "You input \$str1";#转义字符使得str2不会插入str3

4、if

基本与C语言一致,example:

需要注意的是 perl 的 elseif 写作 elsif

$str22 = "vhwroivqpo";
if($str22 eq "abc")
{
    print "OK" . "\n";
}
else
{
    print "NOT OK" ."\n";
}

5、用户输入

输入操作符 <STDIN> 示例:

print "input something you want please." . "\n";
$line = <STDIN>;
chomp $line;
print "your input is $line" . "\n";

chomp 操作用于去掉行尾的换行符。

6、while 

perl 程序出现死循环,使用Ctrl + C强制结束。

while的句法和C语言中差不多。

Perl 循环 | 菜鸟教程 (runoob.com)

$count = 0;
while ($count < 10) {
$count += 2;
print "count is now $count\n"; #打印出2 4 6 8 10
}

7、undef

变量在定义后,如果没有被赋值,其默认值为 undef 。

对于数字变量,undef 等价于 0。如果是字符串变量,undef则表现为空字符串。

8、defined

由于undef 有默认行为,在程序执行过程中不报错,但是容易产生不易于理解的方面,可以使用defined函数分辨变量是否为undef,若是 未定义 则返回false,否则返回 true 。

example:

$ee ;
if(not defined($ee))
{
    print "it is a empty string" . "\n";
}

$ee = "123";
if(defined($ee))
{
    print "it is a non-empty string :" .$ee . "\n";
}

result:

it is a empty string
it is a non-empty string :123

9、数组/列表

Perl 数组一个是存储标量值的列表变量,变量可以是不同类型。

数组变量以 @ 开头。访问数组元素使用 $ + 变量名称 + [索引值] 格式来读取,实例如下。

索引序号由0开始,-1表示列表的最后一个元素,$#列表变量名 同样表示最后一个列表元素的索引值。数组内元素的修改则可以通过索引直接赋值的形式进行。

@list1 = (1,2,3,4,5,6,7,8);
print $list1[1] . "\n";
print $list1[$#list1] . "\n";# 索引最后一个
print $list1[-1] . "\n";# 索引最后一个
$list1[0] = "1";
$list1[1] = "2";
$list1[2] = "1";
$list1[3] = "2";
$list1[4] = "1";
$list1[5] = "2";
$list1[6] = "1";
$list1[7] = "2";
print $list1[1] . "\n";
print $list1[$#list1] . "\n";# 索引最后一个
print $list1[-1] . "\n";# 索引最后一个

9.1 数组创建

数组变量以 @ 符号开始,元素放在括号内,也可以以 qw 开始定义数组。Perl 允许使用任何标点符号作为分界符,最好不要用 #

Perl 提供了可以按序列输出的数组形式,格式为 起始值 + .. + 结束值。

@p1 = qw !12 13 45 56 123 11 2223 2345!;
@p2 = qw <12 13 45 56 123 11 2223 2345>;
@p3 = qw *12 13 45 56 123 11 2223 2345*;
@p4 = qw ?12 13 45 56 123 11 2223 2345?;
@n1 = 0..10;
@a1 = a..d;

@p5 = @p2;                        #将p2列表拷贝到p5。
($p2[0],$p2[1]) = ($p2[1],$p2[0]);#变量交换

$size1 = @p1;      #数组长度
$max_index = $#p1; #数组的最大索引号

@p6 = (@p1,@n1,@a1);#列表的元素也可以为列表

print $size1 . "\t" . $max_index . "\n";
print @p2;print "\n";
print @p6;print "\n";
print @n1;print "\n";
print @a1;print "\n";

 result:

8	7
131245561231122232345
121345561231122232345012345678910abcd
012345678910
abcd

9.2 pop 、push

pop 操作将数组的最后一个元素取出并返回。

push,它可以将一个元素(或者一列元素)加在数组的末尾。

push 的第一个参数或者pop 的唯一参数必须是数组变量。

@t1 = 'a'..'z';print @t1;print "\n";
$a1 = pop @t1;print $a1;print "\n";
push @t1,'k';print @t1;print "\n";
push @t1,@t1;print @t1;print "\n";

result:

abcdefghijklmnopqrstuvwxyz
z
abcdefghijklmnopqrstuvwxyk
abcdefghijklmnopqrstuvwxykabcdefghijklmnopqrstuvwxyk

9.3 shift 、unshift

unshift  和 shift  对一个数组的开头进行操作(数组的左端有最小下标的元素)。

unshift类似于push;shift类似于pop。

@t1 = 'a'..'z';print @t1;print "\n";
$a1 = shift @t1;print $a1;print "\n";
unshift @t1,'kkkk';print @t1;print "\n";
unshift @t1,@t1;print @t1;print "\n";

result:

abcdefghijklmnopqrstuvwxyz
a
kkkkbcdefghijklmnopqrstuvwxyz
kkkkbcdefghijklmnopqrstuvwxyzkkkkbcdefghijklmnopqrstuvwxyz

9.4 取数组子集

@t1 = ('a'..'z')[10..15];print @t1;print "\n";
@t2 = @t1[1..3];print @t2;print "\n";

result:

klmnop
lmn

9.5 splice

splice函数用于实现数据元素替换。

示例:

@t1 = ('a'..'z')[10..20];print @t1;print "\n";
splice @t1, 2, 2, qw/& &/; print @t1;print "\n";
splice @t1, 4, 2, qw/* */; print @t1;print "\n";

 result:

klmnopqrstu

kl&&opqrstu

kl&&**qrstu

9.6 split

示例:

# 定义字符串
$var_test = "runoob";
$var_string = "www-runoob-com";
$var_names = "google,taobao,runoob,weibo";
 
# 字符串转为数组
@test = split('', $var_test);
@string = split('-', $var_string);
@names  = split(',', $var_names);
 
print "$test[3]\n";    # 输出 o
print "$string[2]\n";  # 输出 com
print "$names[3]\n";   # 输出 weibo

 result:

o

com

weibo

9.7 join

example:

# 定义字符串
$var_string = "www-runoob-com";
$var_names = "google,taobao,runoob,weibo";
 
# 字符串转为数组
@string = split('-', $var_string);
@names  = split(',', $var_names);
 
 
# 数组转为字符串
$string1 = join( '%', @string );
$string2 = join( '*', @names );
 
print "$string1\n";
print "$string2\n";

 result:

www%runoob%com

google*taobao*runoob*weibo

9.8 sort

sort 操作将输入的一串列表(可能是数组)根据内部的字符顺序进行排序。如对于ASCII 字符串,将根据ASCII 序进行排序。和reverse 一样,其参数是不会受到影响的。如果想将某个数组排序,那必须将排序之后的结果存回数组中。

# 定义数组
@sites = qw(google taobao runoob facebook apple blue break cup);
print "排序前: @sites\n";
 
# 对数组进行排序
@sites = sort(@sites);
print "排序后: @sites\n";

 result:

排序前: google taobao runoob facebook apple blue break cup

排序后: apple blue break cup facebook google runoob taobao

9.9 reverse

reverse(逆转)操作将输入的一串列表(可能是数组)按相反的顺序返回。注意reverse 返回逆转的列表,它不会改变其参数的值。如果返回值没有赋值给某个变量,那这个操作是没有什么意义的。

@t1 = ('a'..'z')[10..20];print "@t1\n";
@t2 = reverse @t1;print "@t2\n";

result:

k l m n o p q r s t u

u t s r q p o n m l k

10、foreach

主要用于遍历列表,语法格式:

foreach var (list) {
...
}

示例:

@t1 = ('a'..'z')[10..20];print "@t1\n";
foreach $k (@t1){
    print "$k \n";
}

result:

k l m n o p q r s t u

k

l

m

n

o

p

q

r

s

t

u

11、scalar

scalar只是用来告诉perl 解释器这是一个标量。

@rocks = qw(talc quartz jade obsidian);
print "How many rocks do you have?\n";
print "I have ", @rocks, "rocks!\n"; #错误,输出rocks 的名字
print "I have ". @rocks. "rocks!\n"; #正确,输出其数字
print "I have ", scalar @rocks, "rocks!\n"; #正确,输出其数字

result:

How many rocks do you have?

I have talcquartzjadeobsidianrocks!

I have 4rocks!

I have 4rocks!

12、多行输入 @lines = <STDIN>;

@lines = <STDIN>; #读入所有的行
chomp = (@lines); #去掉所有的换行符

或者:

chomp (@lines = <STDIN>); #读入所有的行,不包括换行符

Unix 系统中应当使用CTRL+D 表明end-of-file,在Windows 系统中使用CTRL+Z。

13、子程序(函数)

语法格式:

13.1、向子程序传递参数

Perl 子程序可以和其他编程一样接受多个参数,子程序参数使用特殊数组 @_ 标明。

因此子程序第一个参数为 $_[0], 第二个参数为 $_[1], 以此类推。

不论参数是标量型还是数组型的,用户把参数传给子程序时,perl默认按引用的方式调用它们。

# 定义求平均值函数
sub Average{
   # 获取所有传入的参数
   $n = scalar(@_);
   $sum = 0;
 
   foreach $item (@_){
      $sum += $item;
   }
   $average = $sum / $n;
   print '传入的参数为 : ',"@_\n";           # 打印整个数组
   print "第一个参数值为 : $_[0]\n";         # 打印第一个参数
   print "传入参数的平均值为 : $average\n";  # 打印平均值
}
 
# 调用函数
Average(10, 20, 30);

13.2、子程序返回值

子程序可以向其他编程语言一样使用 return 语句来返回函数值。

如果没有使用 return 语句,则子程序的最后一行语句将作为返回值

13.3、子程序的私有变量

默认情况下,Perl 中所有的变量都是全局变量,这就是说变量在程序的任何地方都可以调用。

如果我们需要设置私有变量,可以使用 my 操作符来设置。

my 操作符用于创建词法作用域变量,通过 my 创建的变量,存活于声明开始的地方,直到闭合作用域的结尾。

闭合作用域指的可以是一对花括号中的区域,可以是一个文件,也可以是一个 if, while, for, foreach, eval字符串。

13.4、变量临时赋值

我们可以使用 local 为全局变量提供临时的值,在退出作用域后将原来的值还回去。

local 定义的变量不存在于主程序中,但存在于该子程序和该子程序调用的子程序中。

example:

# 全局变量
$string = "Hello, World!";
 
sub PrintRunoob{
   # PrintHello 函数私有变量
   local $string;
   $string = "Hello, Runoob!";
   # 子程序调用的子程序
   PrintMe();
   print "PrintRunoob 函数内字符串值:$string\n";
}
sub PrintMe{
   print "PrintMe 函数内字符串值:$string\n";
}
 
sub PrintHello{
   print "PrintHello 函数内字符串值:$string\n";
}
 
# 函数调用
PrintRunoob();
PrintHello();
print "函数外部字符串值:$string\n";

result:

PrintMe 函数内字符串值:Hello, Runoob!
PrintRunoob 函数内字符串值:Hello, Runoob!
PrintHello 函数内字符串值:Hello, World!
函数外部字符串值:Hello, World! 

13.5、静态变量

state操作符功能类似于C里面的static修饰符,state关键字将局部变量变得持久。

state也是词法变量,所以只在定义该变量的词法作用域中有效。

注1:state仅能创建闭合作用域为子程序内部的变量。

注2:state是从Perl 5.9.4开始引入的,所以使用前必须加上 use。

注3:state可以声明标量、数组、哈希。但在声明数组和哈希时,不能对其初始化(至少Perl 5.14不支持)。

use feature 'state';
 
sub PrintCount{
   state $count = 0; # 初始化变量
 
   print "counter 值为:$count\n";
   $count++;
}
 
for (1..5){
   PrintCount();
}

result:

counter 值为:0

counter 值为:1

counter 值为:2

counter 值为:3

counter 值为:4

子程序调用过程中,会根据上下文来返回不同类型的值,比如以下 localtime() 子程序,在标量上下文返回字符串,在列表上下文返回列表。

# 标量上下文
my $datestring = localtime( time );
print $datestring;
 
print "\n";
 
# 列表上下文
# $year 的值是从 1900 年作为起始年开始的计数
($sec,$min,$hour,$mday,$mon, $year,$wday,$yday,$isdst) = localtime(time);
printf("%d-%d-%d %d:%d:%d",$year+1900,$mon+1,$mday,$hour,$min,$sec);
 
print "\n";

result:

Wed Jun 12 15:17:32 2024

2024-6-12 15:17:32

14、运算符合集

14.1、算术运算符

14.2、比较运算符

14.3、逻辑运算符

14.4、赋值运算符

14.5、位运算符

14.6、引号运算符

14.7、其他运算符

14.8、运算符优先级

15、三目运算符 ? : 

16、时间日期

Perl中处理时间的函数有如下几种:

  • 1、time() 函数:返回从1970年1月1日起累计的秒数
  • 2、localtime() 函数:获取本地时区时间
  • 3、gmtime() 函数: 获取格林威治时间

Perl 时间日期 | 菜鸟教程 (runoob.com)

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1815559.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入理解Qt多线程编程(QThreadPool)

多线程编程在现代软件开发中变得越来越重要&#xff0c;它能够提高应用程序的响应速度和处理性能。在Qt框架中&#xff0c;QThreadPool作为线程池管理工具&#xff0c;被频繁的使用。 目录 概述 接口介绍 底层原理解析 使用方法 概述 QThreadPool是Qt提供的一个线程池实现&a…

钢结构厂房降温方案

钢结构厂房降温方案 这种钢结构的厂房的车间大&#xff0c;天就晒透了&#xff0c;然后你的工作往往外温度又高&#xff0c;你前面又弄个大火炉烤你身上&#xff0c;你能不热吗&#xff1f;你热怎么办&#xff1f;风扇你就是在25左右的时候吹着挺舒服的&#xff0c;因为它毕竟…

179.二叉树:合并二叉树(力扣)

代码解决 /*** 二叉树节点的定义。* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, Tre…

Pytorch--Convolution Layers

文章目录 1.nn.Conv1d2.torch.nn.Conv2d()3.torch.nn.ConvTranspose1d()3.torch.nn.ConvTranspose2d() 1.nn.Conv1d torch.nn.Conv1d() 是 PyTorch 中用于定义一维卷积层的类。一维卷积层常用于处理时间序列数据或具有一维结构的数据。 构造函数 torch.nn.Conv1d() 的语法如…

如何用Vue3构建一个交互式音乐播放器

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 Vue.js 开发音乐播放器卡片 应用场景 这款音乐播放器卡片旨在为音乐应用程序提供一个现代而交互式的用户界面。它包含诸如歌曲信息、播放进度条和控制按钮等关键功能。 基本功能 **歌曲信息显示&#xff1a…

Xinstall:解决App安装跳转难题,让你的用户流畅体验不再受阻

在互联网流量红利逐渐衰退的今天&#xff0c;App推广和运营面临着前所未有的挑战。如何确保在多变的互联网环境下&#xff0c;迅速搭建起能时刻满足用户需求的运营体系&#xff0c;已经成为众多企业急待解决的问题。今天&#xff0c;我们就来探讨一下如何通过Xinstall的安装跳转…

软件工程期末复习题

目录 选择 判断 选择 下列说法中正确的是 ( B )。 A、20 世纪50 年代提出了软件工程的概念摇 B、20 世纪60 年代提出了软件工程的概念 C、20 世纪70 年代出现了客户端/ 服务器技术 D、20 世纪80 年代软件工程学科达到成熟 软件危机的主要原因是 ( D )。 A、软件工具落后…

电子画册制作与传统画册相比,有哪些优势?

在当今数字化时代&#xff0c;电子画册作为一种新兴的媒体形式&#xff0c;其制作与传统画册相比具有显著的优势。以下是对这些优势的详细探讨。 首先&#xff0c;电子画册的制作过程通常更加便捷和经济。相较于传统画册需要经历的繁琐的印刷过程&#xff0c;电子画册的制作大多…

RocketMQ教程(八):RocketMQ的集群搭建

集群架构 RocketMQ 的各个组件都可以搭建成集群部署,Broker 还可以搭建成主从架构,下面介绍的主要是 Broker 集群。 数据复制策略 复制策略是Broker的Master与Slave间的数据同步方式。分为同步复制与异步复制: 同步复制 消息写入master后,master会等待slave同步数据成…

【C++】——继承(详解)

一 继承的定义和概念 1.1 继承的定义 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保 持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类&#xff0c;被继承的称为基类…

wordpress主题开发

科普一&#xff1a;wordpress 是一套用 php 这个语言写的CMS后台管理系统&#xff0c;即我们大家的 wordpress 网站后台是一样的&#xff0c;能体现我们网站外观不同的地方就在于wordpress主题&#xff08;即皮肤&#xff09;&#xff0c;而这个主题的基本构成是 htmlcssjavasc…

使用Python爬取temu商品与评论信息

【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python与爬虫领域研究与开发工作&#xff01; 【&…

javaWeb项目-ssm+vue网上租车系统功能介绍

本项目源码&#xff1a;java-基于ssmvue的网上租车系统源码说明文档资料资源-CSDN文库 项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、…

系统运维联盟 5 月会议召开,围绕“进展、规划与合作”展开讨论

2024 年 5 月 28 日&#xff0c;龙蜥社区系统运维联盟&#xff08;SOMA&#xff0c;以下简称“运维联盟”&#xff09;月度会议于线上召开&#xff0c;12 家运维联盟单位、 20 位代表出席&#xff0c;缺席 1 家。本次会议由龙蜥社区运营委员会副主席、运维联盟秘书处负责人金美…

openh264 编码器源码分析:AnalyzePictureComplexity 函数

介绍 文件位置&#xff1a; openh264/codec/processing/src/complexityanalysis/ComplexityAnalysis.cpp 功能&#xff1a; 作为CWelsPreProcess类中一个方法&#xff0c;用来分析当前图像与参考图像之间的复杂度关系&#xff0c;以便编码策略。 原型&#xff1a; void CWels…

为什么要学习Flink系统管理及优化课程?

Flink系统是一种流式处理框架&#xff0c;能够高效地处理大规模数据流。然而&#xff0c;要确保Flink系统的正常运行&#xff0c;就需要进行系统管理和优化。系统管理是指对Flink集群的监控、调度和维护&#xff0c;而系统优化则是指通过调整参数和优化算法&#xff0c;提高Fli…

Class-Aware Self-Distillation for Remote SensingImage Scene Classification

这篇文章提出了一种新的蒸馏方式&#xff0c;由于遥感场景图像具有类间相似性和类内多样性的特点&#xff0c;这篇文章试图解决这个问题。通过三个共享权重的分支&#xff0c;同时输入三张图片&#xff0c;其中两张类别相同的图片&#xff0c;一张类别不同但地物特征相似的图片…

Go变量作用域精讲及代码实战

1. 变量的作用域概述 在编程中&#xff0c;变量的作用域&#xff08;Scope&#xff09;定义了变量在程序中的可见性和生命周期。理解变量的作用域对于编写健壮且可维护的代码至关重要。Go语言&#xff08;简称Go&#xff09;提供了几种不同的作用域类型&#xff0c;使得开发者可…

腾讯云SSL证书获取及Nginx配置教程

前言 很多人应该都有属于自己网站,刚开始基本是只能用http进行访问,无法使用https安全访问,但是随着网络安全意识的不断提高,越来越多的网站开始使用HTTPS协议来保护用户的数据安全,SSL证书是实现HTTPS协议的关键组件,本文将讲解如何在腾讯云上获取SSL证书,并配置到Ngi…

为什么要做数字化转型?数字化转型对企业的意义?

本人研究企业数字化转型9年多&#xff0c;为企业软件选型、数字化提供咨询服务&#xff01;目前重点研究低代码数字化转型玩法&#xff0c;力争为各行各业探索出一条最具性价比的数字化方式。 【织信低代码】数字化系统一体化的定制开发工具。 什么是数字化转型&#xff0c;为什…