当前位置: 首页 > news >正文

无涯教程-Perl - Subroutines(子例程)

定义子程序

Perl编程语言中 Subroutine子程序定义的一般形式如下:

sub subroutine_name {body of the subroutine
}

调用该Perl Subroutine的典型方式如下-

subroutine_name( list of arguments );

在Perl 5.0之前的版本中,调用 Subroutine的语法略有不同,如下所示。这仍然可以在Perl的最新版本中使用,但是不建议这样做,因为它会绕过 Subroutine原型。

&subroutine_name( list of arguments );

让我们看下面的示例,该示例定义一个简单的函数然后调用它。由于Perl在执行程序之前先对其进行编译,因此在哪里声明 Subroutine都没有关系。

#!/usr/bin/perl# Function definition
sub Hello {print "Hello, World!\n";
}# Function call
Hello();

当执行上述程序时,将产生以下输出-

Hello, World!

参数传递

您可以像在任何其他编程语言中一样将各种参数传递给 Subroutine,并且可以使用特殊数组@_在函数内部访问它们。因此,函数的第一个参数位于$_ [0]中,第二个参数位于$_ [1]中,依此类推。

让我们尝试以下示例,该示例获取一个数字列表,然后打印其平均值-

#!/usr/bin/perl# Function definition
sub Average {# get total number of arguments passed.$n=scalar(@_);$sum=0;foreach $item (@_) {$sum += $item;}$average=$sum/$n;print "Average for the given numbers : $average\n";
}# Function call
Average(10, 20, 30);

当执行上述程序时,将产生以下输出-

Average for the given numbers : 20

List参数传递

由于@_变量是一个数组,因此可以用来为 Subroutine提供列表。但是,由于Perl接受并解析列表和数组的方式,可能很难从@_中提取单个元素。如果您必须将列表与其他标量参数一起传递,则将list作为最后一个参数,如下所示-

#!/usr/bin/perl# Function definition
sub PrintList {my @list=@_;print "Given list is @list\n";
}
$a=10;
@b=(1, 2, 3, 4);# Function call with list parameter
PrintList($a, @b);

当执行上述程序时,将产生以下输出-

Given list is 10 1 2 3 4

Hashes参数传递

当您向接受列表的 Subroutine或运算符提供哈希值时,哈希值将自动转换为键/值(key/value)对列表。如-

#!/usr/bin/perl# Function definition
sub PrintHash {my (%hash)=@_;foreach my $key ( keys %hash ) {my $value=$hash{$key};print "$key : $value\n";}
}
%hash=(name => Tom, age => 19);# Function call with hash parameter
PrintHash(%hash);

当执行上述程序时,将产生以下输出-

name : Tom
age : 19

返回值

您可以像使用其他任何编程语言一样从 Subroutine返回值。如果您没有从 Subroutine中返回值,那么 Subroutine中最后执行的任何计算都会自动返回值。

让我们尝试以下示例,该示例接受一个数字列表,然后返回其平均值-

#!/usr/bin/perl# Function definition
sub Average {# get total number of arguments passed.$n=scalar(@_);$sum=0;foreach $item (@_) {$sum += $item;}$average=$sum/$n;return $average;
}# Function call
$num=Average(10, 20, 30);
print "Average for the given numbers : $num\n";

当执行上述程序时,将产生以下输出-

Average for the given numbers : 20

私有变量

默认情况下,Perl中的所有变量都是全局变量,这意味着可以从程序中的任何位置访问它们。但是您可以随时使用 my 运算符创建称为词法变量的 private 私有变量。

以下示例显示了如何使用 my 运算符定义单个或多个私有变量-

sub somefunc {my $variable; # $variable is invisible outside somefunc()my ($another, @an_array, %a_hash); # declaring many variables at once
}

让我们检查以下示例,以区分全局变量和私有变量:

#!/usr/bin/perl# Global variable
$string="Hello, World!";# Function definition
sub PrintHello {# Private variable for PrintHello functionmy $string;$string="Hello, Perl!";print "Inside the function $string\n";
}
# Function call
PrintHello();
print "Outside the function $string\n";

当执行上述程序时,将产生以下输出-

Inside the function Hello, Perl!
Outside the function Hello, World!

local()临时值

local 通常在变量的当前值必须对所调用的 Subroutine可见时使用。局部变量只是为全局变量提供临时值。这就是动态作用域。

如果将多个变量或表达式赋给local,则必须将它们放在括号中。

让我们检查以下示例以区分全局变量和局部变量-

#!/usr/bin/perl# Global variable
$string="Hello, World!";sub PrintHello {# Private variable for PrintHello functionlocal $string;$string="Hello, Perl!";PrintMe();print "Inside the function PrintHello $string\n";
}
sub PrintMe {print "Inside the function PrintMe $string\n";
}# Function call
PrintHello();
print "Outside the function $string\n";

当执行上述程序时,将产生以下输出-

Inside the function PrintMe Hello, Perl!
Inside the function PrintHello Hello, Perl!
Outside the function Hello, World!

state() 变量

类似于私有变量,但是它们保持其状态,并且在多次调用 Subroutine时不会重新初始化它们。这些变量是使用 state 运算符定义的,可从Perl 5.9.4开始使用。

让我们检查以下示例以演示 state 变量的用法-

#!/usr/bin/perluse feature state;sub PrintCount {state $count=0; # initial valueprint "Value of counter is $count\n";$count++;
}for (1..5) {PrintCount();
}

当执行上述程序时,将产生以下输出-

Value of counter is 0
Value of counter is 1
Value of counter is 2
Value of counter is 3
Value of counter is 4

在Perl 5.10之前,您必须像这样编写它-

#!/usr/bin/perl{my $count=0; # initial valuesub PrintCount {print "Value of counter is $count\n";$count++;}
}for (1..5) {PrintCount();
}

上下文

Subroutine或语句的上下文定义为期望的返回值的类型。这使您可以使用一个函数,该函数根据用户期望接收的内容返回不同的值。如以下localtime()在标量上下文中调用时返回一个字符串,但是在列表上下文中调用时返回一个列表。

my $datestring=localtime( time );

在此示例中,$time的值现在是由当前日期和时间组成的字符串,如Thu Nov 30 15:21:332000。反之

($sec,$min,$hour,$mday,$mon, $year,$wday,$yday,$isdst)=localtime(time);

现在,各个变量包含由localtime() Subroutine返回的相应值。

Perl - Subroutines(子例程) - 无涯教程网无涯教程网提供定义子程序Perl编程语言中 Subroutine 子程序定义的一般形式如下: sub subroutine_nam...https://www.learnfk.com/perl/perl-subroutines.html

相关文章:

无涯教程-Perl - Subroutines(子例程)

定义子程序 Perl编程语言中 Subroutine子程序定义的一般形式如下: sub subroutine_name {body of the subroutine } 调用该Perl Subroutine的典型方式如下- subroutine_name( list of arguments ); 在Perl 5.0之前的版本中,调用 Subroutine的语法略有不同&…...

Rpc异步日志模块

Rpc异步日志模块作用 在一个大型分布式系统中,任何部署的分布式节点都可能发生崩溃,试想如果用普通的办法,即先排查哪个节点down掉了,找到down掉的节点后采取调试工具gdb调试该节点,进而排查宕机的原因。这中排查方法…...

python-pip

pip 路径 python 下载后自带pip ,在scripts 下,如 D:\install\python\Scripts numpy pip3 install numpy scipy matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simplepandas D:\install\python\Scripts>pip3 install pandas -i https://pypi.tuna.tsingh…...

无涯教程-Perl - getppid函数

描述 该函数返回父进程的进程ID。 语法 以下是此函数的简单语法- getppid返回值 该函数返回父进程的进程ID。 例 以下是显示其基本用法的示例代码- #!/usr/bin/perl$ppidgetppid();print "Parent Process ID $ppid\n";执行上述代码后,将产生以下输出- Paren…...

AUTOSAR规范与ECU软件开发(基础篇)1.2 汽车电子控制系统的基本构成

目录 前言 1、 传感器 2、 电子控制单元(ECU) 3、 执行器 前言 汽车电子控制系统主要由传感器(Sensor) 、 电子控制单元(Electronic Control Unit, ECU) 和执行器(Actuator) 组成(图1.1) ,对被控对象(Controlled Object)...

一个可以通过多个条件筛选的系统界面是如何实现的(springboot+mybatis)

比如我们有一个订单记录管理界面 条件可以通过订单号、商品名称、创建日期范围、价格范围。。。来进行筛选查询。 首先我们先确定数据库订单表(我这里就不做连表了,都放在一个表中)模拟一个订单表 order表 订单号商品名称创建日期价格地址…...

WebRTC | 实现数据流的一对一通信

目录 一、浏览器对WebRTC的支持 二、MediaStream与MediaStreamTrack 三、RTCPeerConnection 1. RTCPeerConnection与本地音视频数据绑定 2. 媒体协商SDP 3. ICE (1)Candidate信息 (2)WebRTC收集Candidate (3&…...

基于MATLAB小波变换的信号突变点检测

之前在不经意间也有接触过求突变点的问题。在我看来,与其说是求突变点,不如说是我们常常玩的"找不同"。给你两幅图像,让你找出两个图像中不同的地方,我认为这其实也是找突变点在生活中的应用之一吧。回到找突变点位置上…...

JUC并发编程(JUC核心类、TimeUnit类、原子操作类、CASAQS)附带相关面试题

目录 1.JUC并发编程的核心类 2.TimeUnit(时间单元) 3.原子操作类 4.CAS 、AQS机制 1.JUC并发编程的核心类 虽然java中的多线程有效的提升了程序的效率,但是也引发了一系列可能发生的问题,比如死锁,公平性、资源管理…...

个人用C#编写的壁纸管理器 - 开源研究系列文章

今天介绍一下笔者自己用C#开发的一个小工具软件:壁纸管理器。 开发这个小工具的初衷是因为Windows操作系统提供的功能个人不满意,而且现在闲着,所以就随意写了个代码。如果对读者有借鉴参考作用就更好了,能够直接代码段复用即可。…...

iTextSharp 生成PDF

示例代码定义了一个名为PdfController的API控制器,其中的GeneratePdf方法创建了一个新的PDF文档,并将内容添加到文档中。最后,将文档内容转换为字节数组,并通过File方法返回给前端。 注意,你需要在你的项目中添加对iT…...

基于微信小程序的传染病酒店隔离平台设计与实现(Java+spring boot+MySQL+微信小程序)

获取源码或者论文请私信博主 演示视频: 基于微信小程序的传染病酒店隔离平台设计与实现(Javaspring bootMySQL微信小程序) 使用技术: 前端:html css javascript jQuery ajax thymeleaf 微信小程序 后端:…...

vue3中用watch监听响应式数据的注意点

如果你在vue3中使用reactive()方法创建响应式数据,然后又用torefs()方法将响应式数据解构成单一的ref响应式数据。 此时,如果你想用watch监听解构出来单一的响应式数据,watch不起作用。 此时,你需要用watch监听之前的reactive()…...

Jmeter(五) - 从入门到精通 - 创建网络计划实战和创建高级Web测试计划(详解教程)

1.简介 上一篇中已经将其的理论知识介绍了一下,这一篇就带着大家一步一步的把上一篇介绍的理论知识实践一下,然后再说一下如何创建高级web测试计划。 2.网络计划实战 通过上一篇的学习,将其分类为: (1)不需…...

【单片机】51单片机,TLC2543,驱动程序,读取adc

TLC2543 是一款 12 位精密模数转换器 (ADC)。 1~9、11、12——AIN0~AIN10为模拟输入端; 15——CS 为片选端; 17——DIN 为串行数据输入端;(控制字输入端,用于选择转换及输出数据格式) 16——…...

誉天HCIE-Cloud_Computing3.0课程简介

课时:60 第一天 1. 华为云 Stack 解决方案及架构介绍 3. 华为云 Stack 的安装流程解析及规划设计 4. 华为云 Stack 的网络平面的规划解析 5. 华为云 Stack Deploy 部署工具的安装,配置,创建工程,下载 LLD 表 6. 华为云 Stack 的 …...

Unity之ShaderGraph 节点介绍 Procedural节点

程序化 噪声Gradient Noise(渐变或柏林噪声)Simple Noise(简单噪声)Voronoi(Voronoi 噪声) 形状Ellipse(椭圆形)Polygon(正多边形)Rectangle(矩形…...

期权定价模型系列【1】—BSM通用式模型

这是期权定价模型专栏的第一篇文章,此专栏旨在分享一些期权定价模型,将会从最基础的BSM模型开始写起,逐步扩散到蒙特卡洛模拟、二叉树等数值法模型,以及跳跃扩散模型、随机波动率模型,神经网络模型等等。 如果你觉得有…...

HA3 SQL样本实验:一种混合计算查询的全新样本解决方案

作者:陆唯一(芜霜) HA3(对外开源代号:Havenask )是阿里智能引擎团队自研的大规模分布式检索系统,广泛应用于阿里内部的搜索业务,是十多年来阿里在电商领域积累下来的核心竞争力产品。Ha3 SQL 是在原有Ha3引…...

Linux(Web与html)

域名 DNS与域名: 网络是基于tcp/ip协议进行通信和连接的 tcp/ip协议是五层协议:应用层–传输层—网络层----数据链路层----物理层每一台主机都有一个唯一的地址标识(固定的ip地址,用于区分用户和计算机。 ip地址:由…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...

git: early EOF

macOS报错: Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...

【51单片机】4. 模块化编程与LCD1602Debug

1. 什么是模块化编程 传统编程会将所有函数放在main.c中,如果使用的模块多,一个文件内会有很多代码,不利于组织和管理 模块化编程则是将各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数声明,其他.c文…...