Perl 闭包实现简单OO

perl 闭包 就像我们有无数的方法创建引用一样,我们也有好几种方法使用引用(或者称之为解引用).使用过程中只有一个最高兴的原则:Perl不会做任何隐含的引用或者解引用动作。如果一个标量挂在了一个引用上,那么它总是表现出简单标量的行为。它不会突然就称为一个数组或者散列或是子过程,你必须明确地告诉它进行转变,方法就是对它解引用。8.3.1 把一个变量当作变量名使用如果你看到一个标量,比如$foo,你应该把它看成fo 阅读详情

闭包是个神奇的东西,有很多奇妙地用法,用它可以来模拟实现OO 的一些功能。以下代码用闭包和消息传递的方法实现了OO 继承,重写。有兴趣可以看看Lisp CLOS 的实现方法,参考用来模拟实现另外一种Perl OO。可以看看Meta programming,Mouse 的OO 实现部分,相信会对你有很大的帮助。

sub shape {
	(my $newx, $newy) = @_;
	
	return sub{
		my ($method, @param) = @_;
		if($method eq 'getx'){
			$newx
		}
		elsif($method eq 'gety'){
			$newy
		}
		elsif($method eq 'setx'){
			$newx = $param[0];
		}
		elsif($method eq 'sety'){
			$newy = $param[1];
		}
		elsif($method eq 'moveto'){
			($newx, $newy) = @param
		}
		elsif($method eq 'draw'){
			"$newx, $newy"
		}
		else{
			die "bad method";
		}
	}
}

sub circle {
	(my $newx, $newy, $newz) = @_;
	my $super = shape $newx, $newy;
	return sub {
		my ($method, @param) = @_;
		if($method eq 'getz'){
			$newz
		}
		elsif($method eq 'setz'){
			$newz = $param[0];
		}
		elsif($method eq 'moveto'){
			$super->('moveto', @param);
			$newz = $param[2];
		}
		elsif($method eq 'draw'){
			$super->('draw').", $newz"
		}
		else{
			$super->(@_);
		}
	}
}

$y = circle 100,200,300;
$y->('setx',120);
$y->('setz',320);
$y->('moveto',500,987,600);
print $y->('draw');

 

第四章 闭包 闭包(Closure) 闭包是这样一种子例程,创建时,它将包含其子例程的环境打包(包括所有它需要的和不局部去本身的变量). 子例程的引用: 对有名子例程的引用: 我们前面就已经讲过,要创建对现存变量的引用,只需要它加上反斜杠前缀。对子例程也大致如此, 如\&mysub就是对&mysub的引用。 比如: zjzc01:/root/perl# cat t8.pl sub greet 阅读详情

相关推荐

7、Perl 闭包与 eval 函数的深入解析

本文深入解析了 Perl 中的闭包和 eval 函数。在闭包部分,详细探讨了其作为‘智能’回调、迭代器/流的应用,以及与对象和其他语言的比较,展示了 Perl 闭包的独特优势。在 eval 函数部分,分别介绍了其字符串形式和块形式的使用方式,并总结了注意事项和应用场景。通过这些内容,可以更好地理解和运用 Perl 的强大编程特性。

swift5iosmith的博客 88

Perl中的闭包(closure)

什么是闭包,“This is a notion out of the Lisp world that says if you define an anonymous function in a particular lexical context, it pretends to run in that context even when it's called outside of the con...

云计算? 186

子例程引用和闭包

1. 调度表(dispatch table) tk图形用户界面工具包 my (@frames,@button); my %sub_of = ( "日志查询" => \&push_button2 , "VIEW MEMORY" => \&push_button2 , "VIEW DISK" => \&push_button3 ,

zhaoyangjian724的专栏 441

perl中的闭包使用

直接先上代码,看看示例一的实现: 示例一: sub make_new_counter{ my $start = shift; #返回匿名函数 return sub{ #自由变量 print $start++ ,"\n"; ...

weixin_30362083的博客 172

第<4>章 子例程引用与闭包

和普通变量一样,子例程(subroutine) 可以是有名的也可以是匿名的,而且Perl 语法上支持对任何一种类型的引用。 对有名子例程的引用: 我们前面已经讲过,要创建对现存变量的引用,只需给它加上反斜杠前缀。对子例程也大致如此, 如\&mysub 就是对&mysub的引用,又比如: zjzc01:/root/hei# cat a24.pl sub greet { print "

zhaoyangjian724的专栏 503

第八章 引用:

第八章 引用: 在C里,间接的最常见的形式就是指针,它可以让一个变量保存另外一个变量的内存地址。 在Perl里,间接的最常见的形式是引用 @vitals = ('john', 'mary', 'bill'); 一个引用可以指向任何数据结构。因为引用是标量,所以你可以把它们保存在数组的散列里, 因此我们就可以做出数组的数组,散列的数组,数组的散列 8.2.1 反斜杠操作符:

zhaoyangjian724的专栏 183

Perl 5 中的三大OO特性

Encapsulation首先,将代码段进行封装,成函数。使用中可以优化,并降低代码冗余度,将先前的函数泛化。再次,总结所处理对象特性,提取重构成类。 code block —–> subroutine —–> generalization —–> rarefaction (Class) Inheritance继承是 OO 呈上启后的特性。在Perl 5 中使用 use parent xxx;

BruceXiaoYY的博客 852

第8章 引用

第8章 引用 假设你想制作一个简单的表(二维数组),为一组人员显示生命数据用---包括年龄,眼睛颜色,和重量等。 你可以通过先给每个队里的成员创建一个数组来实现这个目的: @john = (47,"brown",186); @mary =(23,"hazel",128); 在C里,间接的最常见的形式就是指针,它可以让一个变量保存另外一个变量的内存地址。 在Perl里,间接的最常

zhaoyangjian724的专栏 247

Perl 闭包模拟类实现二叉树

在上一篇文章中用函数方式实现了一个二叉树,本篇用闭包模拟类的方式来重新实现,不同于传统意义的Perl 类,否则也不用去费力重新实现,本篇用闭包来模拟类的一些行为,以消息传递的方式调用方法。 功能同上一个版本的基本一样,是用闭包的好处: 1。 模拟类行为,开放类方法 2。 内部变量不可直接修改,只能通过方法调用获取或修改值 3。 消息类型多样,自己可以随便控制 特点: 1

USTBHacker的专栏 1754

《联邦学习实战》杨强 读书笔记十四——构建公平的大数据交易市场

当数据具有资产属性之后,数据便可以直接或者间接地为公司、为社会创造价值和收益,并且可以作为一种特殊的商品在市场中进行交易。 与传统的商品交易相比,数据资产交易的市场前景更广阔,但同时也面临着很多的挑战,主要包括: 数据的质量、价格如何定义 在合法合规的前提下,数据的交易如何确保不会泄露用户的隐私 如何构建合理的激励机制来鼓励更多的参与方加入数据交易市场中 大数据交易 数据交易的定义 数据交易是指一种对数据进行买卖的行为,大数据交易由三方共同参与,分别为数据提供方、大数据交易平台和数据需求方:

IEEE802_11的博客 3433

Jetson Orin NX 单目标跟踪算法实战

本文对比了NanoTrack和MixFormerV2两种目标跟踪算法在Jetson Orin NX边缘设备上的实际表现。通过天空小目标跟踪场景测试发现,NanoTrack虽然表征能力较弱,但具有目标身份一致性强、失败模式可控、计算负担小等优势,更适合作为边缘端默认算法。MixFormerV2则适用于高速运动等特定场景。实验数据显示NanoTrack在Orin NX上可达200FPS,远高于MixFormerV2的38-120FPS。建议先采用NanoTrack构建稳定系统,后续再评估复杂算法的适用性。

karmueo46的博客 625

Perl语言的语法糖

在计算机科学中,语法糖指的是一种编程语言的语法特性,它使得某些操作或表达式的书写变得更加简洁或易读,但不会影响语言的表达能力。换句话说,语法糖是让程序员更轻松书写代码的一种功能。在Perl中,语法糖有助于简化程序员的编码过程,使得复杂的逻辑更易于理解,代码可读性和可维护性得以增强。接下来,我们将深入探讨Perl中的一些主要语法糖特性。Perl语言的语法糖为程序员提供了丰富的工具和特性,使得编写可读、可维护的代码成为了一种可能。

2501_90435685的博客 392

卫星通信链路预算实战:从EIRP到Eb/N0的完整计算指南(含Excel模板)

本文提供了一份卫星通信链路预算的实战指南,详细解析了从EIRP到Eb/N0的完整计算流程。文章重点对比了C波段与Ku波段在应对降雨衰减等动态因素时的不同策略,并分享了包含核心公式的Excel模板,帮助工程师将理论转化为可执行的系统设计依据。

weixin_29230773的博客 534

Perl语言核心概念解释与学习

Perl(Practical Extraction and Report Language)是一门以文本处理见长的动态脚本语言,其设计哲学是"不止一种方法去做一件事"(TMTOWTDI)。以下是 Perl 5 的核心概念详解,包含实用代码示例:Perl 有三种基本数据类型,通过前缀符号区分:存储单一值:数字、字符串、引用 2. 数组(Array) 有序标量集合,索引从 0 开始 3. 哈希(Hash) 无序键值对集合(关联数组) 二、函数(子程序) Perl 使用 定义子程序,参数通过 传递: 三、模块

weixin_42849849的博客 736

16G显存+llama.cpp跑大模型的黄金配置指南

大语言模型(LLM)本地部署的核心瓶颈在于显存与推理效率的平衡。llama.cpp作为轻量级C/C++推理引擎,通过GGUF模型格式、量化压缩(如Q4_K_M)和CUDA底层优化,显著降低GPU资源需求。在消费级硬件中,16G显存成为兼顾模型能力(如Qwen3-4B、Llama-3-8B)、长上下文支持(4K token)与系统稳定性的关键阈值。它既规避了12G显存的容量焦虑,又绕开了24G高端卡的成本与散热负担,特别适合Windows 11原生环境下的生产级AI应用,如RAG、智能客服与文档分析。

weixin_32629853的博客 405

AlphaPose复现配置教程

AlphaPose是一种准确的多人姿态估计器,这是第一个在COCO数据集上达到70+ mAP (75 mAP)和在MPII数据集上达到80+ mAP (82.1 mAP)的开源系统。为了匹配跨帧的同一人的姿态,我们还提供了一种高效的在线姿态跟踪器,称为Pose Flow。这是第一个在PoseTrack挑战数据集上达到60+ mAP (66.5 mAP)和50+ MOTA (58.3 MOTA)的开源在线姿态跟踪器。AlphaPose支持Linux和Windows操作系统!指路👉。

m0_56661101的博客 4527

Perl Class::Accessor 分析

最近学习Perl OO, MetaClass 相关的模块,简单的分析一下Class::Accessor 这个模块。 功能: 自动实现字段的存取定义函数。 示例: package Foo; use base qw(Class::Accessor); Foo->follow_best_practice; Foo->mk_accessors(qw(name role salary)

USTBHacker的专栏 1331

华硕ROG玩家国度安装Ubuntu双系统避坑指南:安全启动密钥那些事儿

本文详细解析了在华硕ROG玩家国度设备上安装Ubuntu双系统时,如何正确处理BIOS中的安全启动(Secure Boot)与密钥管理,避免常见的引导失败和Windows系统无法启动问题。指南提供了从数据备份、启动盘制作到BIOS精细设置(如将OS Type改为Other OS而非简单关闭Secure Boot)以及分区规划的完整流程,确保两个系统都能稳定共存。

weixin_29219189的博客 754

常用脚本语言Perl,Python,Ruby,Javascript一 Perl,Python,Ruby,Javascript

常用脚本语言Perl,Python,Ruby,Javascript一 Perl,Python,Ruby,Javascript Javascript现阶段还不适合用来做独立开发,它的天下还是在web应用上。 主要做数据挖掘算法的研究,应该会处理大量的文本。 提到文本处理,相信大部分人都会说应该用Perl。文本处理很强大,语法给人的感觉太乱了, Perl的基本语法,用它做了一些简单的文本处理工...

weixin_30715523的博客 427

YOLOv11 改进 - 注意力机制 | Deformable-LKA 可变形大核注意力:自适应采样网格优化特征捕捉,提升不规则目标感知

本文介绍了可变形大核注意力(D-LKA Attention)及其在YOLOv11中的结合。D-LKA Attention是一种简化的注意力机制,采用大卷积核利用体积上下文信息,通过可变形卷积灵活调整采样网格,适应多样数据模式。它有2D和3D版本,3D版本在跨深度数据理解上表现出色,共同构成了D-LKA Net架构。我们将D-LKA Attention集成进YOLOv11,在模型的检测头部分引入deformable_LKA_Attention模块。实验表明,该方法在分割任务上表现优于现有方法,提升了模型的检测

魔改工程师的博客 1170

Claude Code 处理长任务 + Cursor 专注交互:双栈协作的 3 种分工场景与响应提速 35% 实测

揭示 Claude Code 与 Cursor 在 AI 编程中的本质分工:Claude Code 作为离线式架构师处理跨文件、带约束的长链路重构(如单体拆微服务),Cursor 作为现场交互工程师专注秒级局部编辑;提出按任务切片动态切换的三种工程化协作场景,并给出结构化上下文构建、约束型 Prom

weixin_28728443的博客 123

Perl输出带颜色行号或普通输出行

定义好了一个可以输出带颜色行号以及行数据的函数print_with_line_num,f()是测试函数。在f()函数中,读取文件并输出读取的每一行数据,但根据参数选项决定是普通输出行还是同时输出带颜色行号的行数据。 这可以当作是偏函数、闭包、作用域的一个用法示例。 脚本内容如下: #!/usr/bin/perl -w use strict; use 5.010; # print string...

weixin_30292843的博客 391

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Usefunctional programming in Perl to make test automation code more structural

Abstract In USD test automation, we used Perl as the majorprogramming language. With daily practice, we noticed that as a programminglanguage, Perl does not enforce any particular programming paradig

xdstone1的专栏 2415

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

perl 调试 条件断点_使用条件断点进行更好的调试

perl 调试 条件断点I love conditional breakpoints. Really! They're my favorite debugging tool. 我喜欢有条件的断点 。 真! 它们是我最喜欢的调试工具。 When I got started in web development, "debugging" for me meant creating a &lt...

culuo8053的博客 399

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

上一篇: Perl dynamic property, method
下一篇: Perl 引用变量传入函数中的行为
Bai_Yuanyong
博客等级 码龄24年 46粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值