perl 语言中 AUTOLOAD 的用法
这里的 AUTOLOAD可以理解为自动加载。具体来说就是,在正常情况下,我们不能调用一个尚未定义的函数(子例程)。不过,如果在未定义函数的包中有一个名为 AUTOLOAD的函数,那么对未定义函数的调用都会路由至这个 AUTOLOAD函数,并且会为该函数提供相同的参数。因此,我们可以在 AUTOLOAD函数里面针对未定义的函数进行特殊处理,比如实现未定义的函数,然后调用该函数,就好像这个函数一直都存在一样。
比如,下面的示例程序会在你调用未定义函数时发出警告,而不是直接退出:
#!/usr/bin/env perlsub AUTOLOAD {our $AUTOLOAD;warn "You attempt to call an undefined function: $AUTOLOAD\n";
}&foo; # $AUTOLOAD will be set to main::foo
print "Exit normally ...\n"
运行结果如下所示:
$ ./autoload.pl
You attempt to call an undefined function: main::foo
Exit normally ...
下面是一个更加实用的例子,即我们在 AUTOLOAD中实现未定义的函数:
#!/usr/bin/env perlsub AUTOLOAD {my $name = our $AUTOLOAD;*$AUTOLOAD = sub { print "calling function $name(@_)\n"; };goto &$AUTOLOAD;
}foo(30);
goo(40);
hoo(50);
运行结果如下所示:
$ ./autoload_2.pl
calling function main::foo(30)
calling function main::goo(40)
calling function main::hoo(50)
在OpenSSL项目中的很多地方都有用到 perl语言,它主要负责项目建构和汇编代码的生成工作。其中,在生成加解密算法汇编优化代码的 perl脚本中,有很多架构都用到了 AUTOLOAD机制去简化汇编指令的书写。下面看一个 OpenSSL中 x86实现的例子,从 crypto/chacha/asm/chacha-x86_64.pl文件中节选出如下代码:
#!/usr/bin/env perlsub AUTOLOAD() # thunk [simplified] 32-bit style perlasm
{ my $opcode = $AUTOLOAD; $opcode =~ s/.*:://;my $arg = pop;$arg = "\$$arg" if ($arg*1 eq $arg);$code .= "\t$opcode\t".join(',',$arg,reverse @_)."\n";
}@x=("%eax","%ebx","%ecx","%edx",map("%r${_}d",(8..11)),"%nox","%nox","%nox","%nox",map("%r${_}d",(12..15)));
@t=("%esi","%edi");sub ROUND { # critical path is 24 cycles per round
my ($a0,$b0,$c0,$d0)=@_;
my ($a1,$b1,$c1,$d1)=map(($_&~3)+(($_+1)&3),($a0,$b0,$c0,$d0));
my ($xc,$xc_)=map("\"$_\"",@t);
my @x=map("\"$_\"",@x);("&add (@x[$a0],@x[$b0])", # Q1"&xor (@x[$d0],@x[$a0])","&rol (@x[$d0],16)","&add (@x[$a1],@x[$b1])", # Q2"&xor (@x[$d1],@x[$a1])","&rol (@x[$d1],16)","&add ($xc,@x[$d0])","&xor (@x[$b0],$xc)","&rol (@x[$b0],12)","&add ($xc_,@x[$d1])","&xor (@x[$b1],$xc_)","&rol (@x[$b1],12)",)
}foreach (&ROUND(0, 4, 8,12)) { eval; }
foreach (&ROUND(0, 5,10,15)) { eval; }print "$code\n";
从上面的代码可以看到,表面上,add(),xor(),rol()这些函数并没有被声明和实现,但该脚本定义了 AUTOLOAD函数,并在 AUTOLOAD函数中进行了统一的处理,比如,将 &add(xx, yy)函数调用转换为了 add yy,xx指令字符串。
因此,上述脚本的运行结果如下所示:
$ ./autoload_3.pl add %r8d,%eaxxor %eax,%r12drol $16,%r12dadd %r9d,%ebxxor %ebx,%r13drol $16,%r13dadd %r12d,%esixor %esi,%r8drol $12,%r8dadd %r13d,%edixor %edi,%r9drol $12,%r9dadd %r9d,%eaxxor %eax,%r15drol $16,%r15dadd %r10d,%ebxxor %ebx,%r12drol $16,%r12dadd %r15d,%esixor %esi,%r9drol $12,%r9dadd %r12d,%edixor %edi,%r10drol $12,%r10d
相关文章:
perl 语言中 AUTOLOAD 的用法
这里的 AUTOLOAD可以理解为自动加载。具体来说就是,在正常情况下,我们不能调用一个尚未定义的函数(子例程)。不过,如果在未定义函数的包中有一个名为 AUTOLOAD的函数,那么对未定义函数的调用都会路由至这个…...
服务器放在香港好用吗?
相较于国内服务器,将网站托管在香港服务器上最直观的好处是备案层面上的。香港服务器上的网站无需备案,因此更无备案时限,购买之后即可使用。 带宽优势 香港服务器的带宽一般分为香港本地带宽和国际带宽、直连中国骨干网 CN2三种。香港…...
C++设计模式_01_设计模式简介(多态带来的便利;软件设计的目标:复用)
文章目录 本栏简介1. 什么是设计模式2. GOF 设计模式3. 从面向对象谈起4. 深入理解面向对象5. 软件设计固有的复杂性5.1 软件设计复杂性的根本原因5.2 如何解决复杂性 ? 6. 结构化 VS. 面向对象6.1 同一需求的分解写法6.1.1 Shape1.h6.1.2 MainForm1.cpp 6.2 同一需求的抽象的…...
Docker技术--WordPress博客系统部署初体验
如果使用的是传统的项目部署方式,你要部署WordPress博客系统,那么你需要装备一下的环境,才可以部署使用。 -1:操作系统linux -2:PHP5.6或者是更高版本环境 -3:MySQL数据环境 -4:Apache环境 但是如果使用Docker技术,那么就只需要进行如下的几行简单的指令: docker run …...
提高代码可读性和可维护性的命名建议
当进行接口自动化测试时,良好的命名可以提高代码的可读性和可维护性。以下是一些常用的命名建议: 变量和函数命名: 使用具有描述性的名称,清晰地表达变量或函数的用途和含义。使用小写字母和下划线来分隔单词,例如 log…...
Docker基础入门:Docker网络与微服务项目发布
Docker基础入门:Docker网络与微服务项目发布 一、前言二、Docker0理解2.1 ip a查看当前网络环境2.2 实战--启动一个tomact01容器(查看网络环境)2.3 实战--启动一个tomact02容器(查看网络环境)2.4 容器与容器之间的通信…...
Docker安装详细步骤
Docker安装详细步骤 1、安装环境准备 主机:192.168.40.5 zch01 设置主机名 # hostnamectl set-hostname zch01 && bash 配置hosts文件 [root ~]# vi /etc/hosts 添加如下内容: 192.168.40.5 zch01 关闭防火墙 [rootzch01 ~]# systemct…...
十六、pikachu之SSRF
文章目录 1、SSRF概述2、SSRF(URL)3、SSRF(file_get_content) 1、SSRF概述 SSRF(Server-Side Request Forgery:服务器端请求伪造):其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能&…...
最新PHP短网址生成系统/短链接生成系统/URL缩短器系统源码
全新PHP短网址系统URL缩短器平台,它使您可以轻松地缩短链接,根据受众群体的位置或平台来定位受众,并为缩短的链接提供分析见解。 系统使用了Laravel框架编写,前后台双语言使用,可以设置多域名,还可以开设套…...
漱玉平民大药房:多元化药店变革的前夜
作者 | 王聪彬 编辑 | 舞春秋 来源 | 至顶网 本文介绍了漱玉平民大药房在药品零售领域的数字化转型和发展历程。通过技术创新, 漱玉平民 建设了覆盖医药全生命周期的大健康生态圈,采用混合云架构和国产分布式数据库 TiDB,应对庞大的会员数据处…...
如何实现AI的矢量数据库
推荐:使用 NSDT场景编辑器 助你快速搭建3D应用场景 然而,人工智能模型有点像美食厨师。他们可以创造奇迹,但他们需要优质的成分。人工智能模型在大多数输入上都做得很好,但如果它们以最优化的格式接收输入,它们就会真正…...
Java与Modbus-TCP/IP网络通讯
1.需求样例 举例5:浮点数参数读取(读取温度测量值)查看参数列表,温度测量值地址为320,根据Modbus协议,读取参数地址转换为16进制为:00H A0H,读取长度为2个字:00H 02H。 …...
音视频 ffmpeg命令图片与视频互转
截取一张图片 ffmpeg -i test.mp4 -y -f image2 -ss 00:00:02 -vframes 1 -s 640x360 test.jpg ffmpeg -i test.mp4 -y -f image2 -ss 00:00:02 -vframes 1 -s 640x360 test.bmp -i 输入 -y 覆盖 -f 格式 image2 一种格式 -ss 起始值 -vframes 帧 如果大于1 那么 输出加%03d t…...
C++的基类和派生类构造函数
基类的成员函数可以被继承,可以通过派生类的对象访问,但这仅仅指的是普通的成员函数,类的构造函数不能被继承。构造函数不能被继承是有道理的,因为即使继承了,它的名字和派生类的名字也不一样,不能成为派生…...
C语言中对json格式数据的解析和封装
首先需要调库:#include <cJSON.h> Json的数据结构介绍: /* The cJSON structure: */ typedef struct cJSON { /*next/prev允许您遍历数组/对象链。或者,使用GetArraySize/GetArrayItem/GetObjectItem */ struct cJSON *next; struct c…...
RT-Thread自动初始化机制
自动初始化机制是指初始化函数不需要被显示调用,只需要在函数定义处通过宏定义的方式进行申明,就会在系统启动过程中被执行。 int rt_hw_usart_init(void) {rt_hw_serial_register(&serial1, "uart1",RT_DEVICE_FLAG_RDWR | RT_DEVICE_FL…...
在本地搭建Jellyfin影音服务器,支持公网远程访问影音库的方法分享
文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及,各种各样的使用需求也被开发出来&…...
强盛集团面试题实战(持续更新)
目录 第一章、面试题1.1)王:8月301.2)1.3) 第二章、2.1)2.2)2.3) 第三章、3.1)3.2)3.3) 第四章、4.1)4.2)4.3) 友情提醒:先…...
golang 协程的实现原理
核心概念 要理解协程的实现, 首先需要了解go中的三个非常重要的概念, 它们分别是G, M和P, 没有看过golang源代码的可能会对它们感到陌生, 这三项是协程最主要的组成部分, 它们在golang的源代码中无处不在. G (goroutine) G是goroutine的头文字, goroutine可以解释为受管理的…...
go gin 参数绑定常用验证器
https://pkg.go.dev/github.com/go-playground/validator/v10#readme-baked-in-validations min 最小max 最大len 长度限制gt 大于eq 等于ne 不等于eqfield 与某个字段值一样nefield 与某个字段值不一样oneof 枚举 ,以空格分开startswithendswithdive 数组 package mainimpor…...
Vivado 时序约束文件 (.xdc) 管理与维护实战指南:从单文件到团队协作
Vivado 时序约束文件 (.xdc) 管理与维护实战指南:从单文件到团队协作 在FPGA设计流程中,时序约束文件(.xdc)如同交通信号灯,为设计指明方向与规则。随着项目规模扩大和团队协作需求增加,如何高效管理这些约…...
告别手写CRUD:用IDEA插件实现数据库到Java代码的智能生成
1. 为什么我们需要告别手写CRUD? 作为一名有多年开发经验的程序员,我深知手写CRUD代码的痛苦。每次新建一个表,就要重复编写几乎相同的实体类、Mapper接口和XML文件。这种重复劳动不仅枯燥乏味,还容易出错。记得有一次我因为手误把…...
STM32串口通信实战指南与常见问题解析
1. 串口通信基础概念解析串口通信作为嵌入式系统中最基础也最常用的通信方式之一,其核心原理是通过单根数据线按位顺序传输数据。与并行通信相比,虽然传输速率较低,但具有布线简单、成本低廉、传输距离远等显著优势。在实际工程应用中&#x…...
智能电网RAG优化:闭环协同与精准检索
RAG论文原理解析、公式含义与错误点对点修正方案 一、论文核心原理详细解析(含场景举例) 本文针对通用RAG框架在术语密集、强监管垂直领域(智能电网)的三大原生适配瓶颈,提出了** RAG领域原生闭环协同RAG范式**,核心是将智能电网领域知识嵌入检索-生成-评估全生命周期,…...
深度解析BG3ModManager:博德之门3模组加载顺序重置问题的架构设计与解决方案
深度解析BG3ModManager:博德之门3模组加载顺序重置问题的架构设计与解决方案 【免费下载链接】BG3ModManager A mod manager for Baldurs Gate 3. 项目地址: https://gitcode.com/gh_mirrors/bg/BG3ModManager BG3ModManager作为《博德之门3》的核心模组管理…...
ArcGIS Pro脚本工具实战:一键自动化面要素数据质量检查与修复
1. 为什么需要自动化面要素质检工具 在GIS数据处理工作中,面要素的质量检查是个绕不开的痛点。我做过不少国土调查和城市规划项目,每次拿到甲方提供的原始数据,光是检查拓扑错误就得花上大半天。传统的手动检查流程有多繁琐呢?你得…...
企业级低代码平台JeecgBoot全攻略:从零基础到实战应用
企业级低代码平台JeecgBoot全攻略:从零基础到实战应用 【免费下载链接】jeecg-boot 一款 AI 驱动的低代码平台,提供"零代码"与"代码生成"双模式——零代码模式一句话搭建系统,代码生成模式自动输出前后端代码与建表 SQL&…...
3步实现Web界面设计标注高效交付:面向全栈团队的Sketch Measure应用指南
3步实现Web界面设计标注高效交付:面向全栈团队的Sketch Measure应用指南 【免费下载链接】sketch-measure Make it a fun to create spec for developers and teammates 项目地址: https://gitcode.com/gh_mirrors/sk/sketch-measure 在Web开发项目中&#x…...
4个硬核特性解决开发者存储管理难题
4个硬核特性解决开发者存储管理难题 【免费下载链接】czkawka Multi functional app to find duplicates, empty folders, similar images etc. 项目地址: https://gitcode.com/GitHub_Trending/cz/czkawka 一、存储困境诊断:开发者面临的四大存储挑战 识别…...
解放你的创造力:用TEdit打造泰拉瑞亚专属世界地图
解放你的创造力:用TEdit打造泰拉瑞亚专属世界地图 【免费下载链接】Terraria-Map-Editor TEdit - Terraria Map Editor - TEdit is a stand alone, open source map editor for Terraria. It lets you edit maps just like (almost) paint! It also lets you change…...
