无涯教程-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 function
   my $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 function
   local $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/perl

use feature state;

sub PrintCount {
   state $count=0; # initial value

   print "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 value

   sub 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

过去几十年来,主要湖泊遭受了严重的水流失

一项新的研究表明,干旱和潮湿地区的损失是全球性的,可能对地球四分之一的人口产生重大影响。 美国宇航局的地表水和海洋地形任务(如图所示)在轨道上运行,将扫描湖泊和水库,为全球湖泊水储存估计提供新数据…

【Python机器学习】实验08 决策树

文章目录 决策树1 创建数据2 定义香农信息熵3 条件熵4 信息增益5 计算所有特征的信息增益,选择最优最大信息增益的特征返回6 利用ID3算法生成决策树7 利用数据构造一颗决策树Scikit-learn实例决策树分类决策树回归Scikit-learn 的决策树参数决策树调参 实验1 通过sk…

weblogic XML反序列化分析——CVE-2017-10271

环境 https://vulhub.org/#/environments/weblogic/CVE-2017-10271/ 启动环境 docker-compose up -d代码审计 传入参数 中间跟进函数 最后的出口 没有限制,直接包参数传入xmlDecoder public String readLine() throws IOException {return (String)this.xml…

css实现卡片的左上角有一个三角形的遮盖效果

需求: 卡片的左上角有一个绿色的三角形标签,用来区分状态 实现: .vCard{position: relative;overflow: hidden; } .vCard::before {content: "";position: absolute;top: 0;left: 0;width: 0;height: 0;border-bottom: 20px solid transparent;border-left: 20px …

OPENCV C++(四)形态学操作+连通域统计

形态学操作 先得到一个卷积核 Mat kernel getStructuringElement(MORPH_RECT,Size(5,5)); 第一个是形状 第二个是卷积核大小 依次为腐蚀 膨胀 开运算 闭运算 Mat erodemat,dilatemat,openmat,closemat;morphologyEx(result1, erodemat, MORPH_ERODE, kernel);morphologyEx…

R语言中数据重塑(长宽表的转化)

学习笔记,仅供学习使用。 目录 1-什么是整洁的数据? 2-宽表变成长表 示例1: 示例2: 示例3: 3-长表变宽表 示例1: 示例2: 1-什么是整洁的数据? 按照Hadley的表述&#xf…

利用abapGit的离线模式导出、导入开发对象

1. 背景 abapGit是为ABAP服务器开发的开源Git客户端,用于在ABAP系统之间导入和导出ABAP对象。 使用abapGit,可以将ABAP对象从任何系统导出到另一个系统,通常是从本地系统导出到云,或者从一个云系统导出到另一个云系统。 当然从…

使用Vscode编辑keil工程

一、需要安装的插件 1. Keil Assistant 2. C/C 3. 中文配置: 二、插件配置 1. Keil Assistant 添加Keil的安装路径 接下来就可以使用vscode编辑Keil的工程了,调试编译和下载程序需要返回到Keil中进行操作。 三、Vscode常用快捷键 可以自定义进行配置…

设计模式行为型——中介者模式

目录 什么是中介者模式 中介者模式的实现 中介者模式角色 中介者模式类图 中介者模式代码实现 中介者模式的特点 优点 缺点 使用场景 注意事项 实际应用 什么是中介者模式 中介者模式(Mediator Pattern)属于行为型模式,是用来降低…

软件为什么要进行性能压力测试?

软件为什么要进行性能压力测试?随着软件应用的不断增多和复杂度的提高,软件的性能对用户体验和业务成功至关重要。性能问题可能导致软件运行缓慢、崩溃或无响应,给用户带来不便甚至损失。为了确保软件能够在高负载和压力下正常运行&#xff0…

微波光子的参数:动态范围

微波光子的参数:无杂散动态范围 无杂散动态范围的定义 微波光子链路中的非线性失真主要由电光调制器的非线性调制产生,这些非线性失真可以分为谐波失真和交调失真两类。图1.2(a)给出了光信号在调制器内被一个频率为10 GHz的射频…

国内做软件行业总是不挣钱?

在国内,很多人都知道,软件最好和硬件结合起来卖,能获得更高的收益。这背后隐藏的意思是,软件作为一门生意,中国人认为没有硬件这门生意好。 在由中国电子信息行业联合会发布的2019年中国软件企业百强榜中,排…

IDEWA项目实践——mybatis的一些基本原理以及案例

系列文章目录 IDEA项目实践——创建Java项目以及创建Maven项目案例、使用数据库连接池创建项目简介 IDEA创建项目的操作步骤以及在虚拟机里面创建Scala的项目简单介绍_intellij 创建scala IDEA项目实践——动态SQL、关系映射、注解开发 文章目录 系列文章目录 1.MyBatis …

CleanMyMac真的有必要买吗 2023年最新CleanMyMac和腾讯柠檬详细解析

在如今的电脑使用过程中,保持电脑干净整洁是一项重要的任务。而随着Mac电脑越来越受欢迎,Mac电脑清理软件也愈发流行。在众多的Mac电脑清理软件中,CleanMyMac是一款备受好评的软件。但是,很多人还在犹豫CleanMyMac有必要买吗&…

你真的了解什么是生成式AI吗?

最近正好有这样的机会,让我给一群非技术人士介绍生成式AI,忙忙碌碌了一阵子,结果发现受众还是未能理解什么是生成式AI,到底和之前的AI有什么区别。因此希望此篇能够帮助普通人真正理解生成式AI,有个直观印象。 人工智…

C语言---数据结构实验---哈夫曼树及哈夫曼编码的算法实现---图的基本操作

文章目录 写在前面哈夫曼树及哈夫曼编码的算法实现实验内容代码实现 图的基本操作实验内容代码实现 写在前面 本篇实验代码非本人写,代码源自外部,经调试解决了部分warning和error后在本地vs上可以正常运行,如有运行失败可换至vs 未来会重构…

Zebec Payroll :计划推2出 WageLink On-Demand Pay,进军薪酬发放领域

“Zebec Protocol生态旨以Web3的方式建立全新的公平秩序,基于其流支付体系构建的薪酬支付板块,就是解决问题的一把利刃” Zebec Protocol在创立之初就有着一个十分宏大的愿景,其希望通过Web3的方式来进一步打破世界上一些不公平现象。 Zebec …

【漏洞复现】Metabase 远程命令执行漏洞(CVE-2023-38646)

文章目录 前言声明一、漏洞介绍二、影响版本三、漏洞原理四、漏洞复现五、修复建议 前言 Metabase 0.46.6.1之前版本和Metabase Enterprise 1.46.6.1之前版本存在安全漏洞,未经身份认证的远程攻击者利用该漏洞可以在服务器上以运行 Metabase 服务器的权限执行任意命…

docker配置远程连接端口

配置docker 配置远程连接端口 vi /lib/systemd/system/docker.servicesystemctl daemon-reload && systemctl restart docker firewall-cmd --zonepublic --add-port2375/tcp --permanenthttp://node2:2375/version

Leetcode.931 下降路径最小和

题目链接 Leetcode.931 下降路径最小和 rating : 1573 题目描述 给你一个 n x n 的 方形 整数数组 m a t r i x matrix matrix ,请你找出并返回通过 m a t r i x matrix matrix 的下降路径 的 最小和 。 下降路径 可以从第一行中的任何元素开始,并从…