无涯教程-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

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

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

相关文章

设计模式之模板方法

一、概述 定义一个操作中的算法的骨架,将一些步骤延迟到子类中。 TemplateMethod使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。 二、适用性 1.一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。 2.各子类中公共…

Java课题笔记~ MyBatis接口开发(代理开发)

使用XML文件进行开发,在调用SqlSession进行操作时,需要指定MyBatis映射文件中的方法,这种调用方式过于烦琐。为解决此问题,MyBatis提供了接口开发的方式。 接口开发的目的: 解决原生方式中的硬编码 简化后期执行SQL …

nacos本地搭建+springCloud服务注册中心-nacos(简易实现)

一.nacos概述 nacos官网 二.Windows使用搭建nacos 较为完整使用参考 1.安装nacos 去nacos github下载nacos最新稳定版本,我用的是nacos-server-2.2.3.zip,下载后解压,得到 2.创建数据库 启动mysql,创建数据库nacos&#xff…

掌握 JVM 的参数及配置

点击下方关注我,然后右上角点击...“设为星标”,就能第一时间收到更新推送啦~~~ JVM(Java虚拟机)是Java编程语言的核心组件之一,它负责执行Java程序,并提供一系列参数和配置选项,可以调整Java程…

Docker实战-操作Docker容器实战(一)

导语   在之前的分享中,我们介绍了关于如何去操作Docker镜像,下面我们来看看如何去操作容器。 简单来讲,容器是镜像运行的一个实例,与镜像不同的是镜像只能作为一个静态文件进行读取,而容器是可以在运行时进行写入操…

docker端口映射详解(随机端口、指定IP端口、随意ip指定端口、指定ip随机端口)

目录 docker端口映射详解 一、端口映射概述: 二、案例实验: 1、-P选项,随机端口 2、使用-p可以指定要映射到的本地端口。 Local_Port:Container_Port,任意地址的指定端口 Local_IP:Local_Port:Container_Port 映射到指定地…

Docker安装Grafana以及Grafana应用

Doker基础 安装 1、 卸载旧的版本 sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine 2、需要的安装包 sudo yum install -y yum-utils 3、设置镜像的仓库 yum-config-m…

Spring Boot 单元测试

目录 1.什么是单元测试? 2.单元测试的优点 3.Spring Boot 单元测试使用 3.1 生成单元测试的类 3.2 添加 Spring Boot 框架测试注解:SpringBootTest 3.3 添加单元测试业务逻辑 3.4 注解 Transactional 4. 断言 1.什么是单元测试? 单元…

39.利用matlab寻找素数(matlab程序)

1.简述 MATLAB嵌套循环允许使用一个循环在另一循环内,下面用一个嵌套循环来把所有从1到100的素数显示出来。 2.代码 %% 学习目标:寻找素数 clear sum5; %求0~100素数之和 ss0; %用来标定是否是素数,0表示不是 p…

C#使用EmguCV播放视频

目录 一、前言 1、简介 2、测试工程代码下载链接 3、EmguCV 库文件下载链接 二、工程环境配置 1、EmguCV控件添加引用 (1)窗口控件添加 (2)相关Dll文件添加添加引用 (3)工程运行基础文件夹添加 &a…

CVS,SVN,Git,Mercurial 代码管理工具

现代软件开发过程中要实现高效的团队协作,需要使用代码分支管理工具实现代码的共享、追溯、回滚及维护等功能。目前流行的代码管理工具,包括 CVS,SVN,Git,Mercurial 等 CVS 和 SVN 是集中管理,Git 具有非常…

解决github打不开的方法

解决github打不开的方法 本文参考文章:解决可ping通但无法访问github网站的问题 一、确定域名github.com的ip地址 进入网址 IP/服务器github.com的信息 - 站长工具 (chinaz.com),查看 ip 地址。 20.205.243.166 github.com二、确定域名github.global.…

使用ubuntu-base制作根文件系统

1:ubuntu官网下载最小根文件系统: 放置到电脑的ubuntu中, Mkdir Ubuntu_rootfs Cd Ubuntu_rootfs Sudo tar –zxvf Ubuntu-bash-xxxxxx.tar.gz 2:电脑的ubuntu安装qemu搭建arm模拟系统 将/usr/bin/qemu-arm-static/(64位拷贝…

Milvus Cloud凭借AI原生,可视化优势荣登全球向量数据库性能排行榜VectorDBBench.com 榜首

在当今的大数据时代,随着人工智能技术的快速发展,向量数据库作为处理大规模数据的关键工具,其性能和效率越来越受到关注。最近,全球向量数据库性能排行榜 VectorDBBench.com 公布了一份最新的评估报告,引人瞩目的是,成立不到一年的新兴公司 Milvus Cloud 凭借其 AI 原生和…

LNMP及论坛搭建

安装 Nginx 服务 systemctl stop firewalld systemctl disable firewalld setenforce 0 1.安装依赖包 #nginx的配置及运行需要pcre、zlib等软件包的支持,因此需要安装这些软件的开发包,以便提供相应的库和头文件。 yum -y install pcre-devel zlib-devel…

抖音seo源码开发源代码搭建分享

抖音SEO源码开发涉及到以下几个方面: 前端开发:包括抖音SEO页面的设计与布局,以及需要使用到的前端技术,如HTML、CSS、JavaScript等。 后端开发:包括抖音SEO页面的数据获取和处理,以及需要使用到的后端技术…

JavaScript数据结构与算法——栈

文章目录 一、初始栈结构1.1 特性1.2 注意事项 二、栈结构的封装2.1 封装简单栈结构2.2 利用栈将十进制转二进制 一、初始栈结构 1.1 特性 类似于汉诺塔,后进先出,每次只能操作栈顶的元素。关键词:压栈、退栈 简单示意图: 1.…

python-面向对象.多态

多态 多态 什么是多态: 定义时的类型和运行时的类型不一样,也就是定义时并不确定要调用的是 哪个方法, 只有运行的时候才能确定调用的是哪个 多态特性 多态性是指在不考虑实例类型的情况下使用实例, 多态性分为静态多态性和动态…

LLM - LLama 模型读取报错 TypeError: not a string

一.引言 读取 LLama2 模型时报错 TypeError: not a string 看异常栈是 AutoTokenizer.from_pretrained 时候的异常。 二.问题解决 出现类似加载模型异常的问题,大致分两类: ◆ 模型地址异常 脚本里传的 pretrained_model Path 有问题,加 …

Eureka 学习笔记5:InstanceRegistry

版本 awsVersion ‘1.11.277’ LeaseManager 接口管理实例的租约信息&#xff0c;提供以下功能&#xff1a; 注册实例取消注册实例实例续约剔除过期实例 public interface LeaseManager<T> {/** 注册实例并续约*/void register(T r, int leaseDuration, boolean isRep…