perl 语言中 AUTOLOAD 的用法

这篇具有很好参考价值的文章主要介绍了perl 语言中 AUTOLOAD 的用法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这里的 AUTOLOAD可以理解为自动加载。具体来说就是,在正常情况下,我们不能调用一个尚未定义的函数(子例程)。不过,如果在未定义函数的包中有一个名为 AUTOLOAD的函数,那么对未定义函数的调用都会路由至这个 AUTOLOAD函数,并且会为该函数提供相同的参数。因此,我们可以在 AUTOLOAD函数里面针对未定义的函数进行特殊处理,比如实现未定义的函数,然后调用该函数,就好像这个函数一直都存在一样。

比如,下面的示例程序会在你调用未定义函数时发出警告,而不是直接退出:

#!/usr/bin/env perl

sub 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 perl

sub 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机制去简化汇编指令的书写。下面看一个 OpenSSLx86实现的例子,从 crypto/chacha/asm/chacha-x86_64.pl文件中节选出如下代码:

#!/usr/bin/env perl

sub 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指令字符串。
因此,上述脚本的运行结果如下所示:文章来源地址https://www.toymoban.com/news/detail-680666.html

$ ./autoload_3.pl 
	add	%r8d,%eax
	xor	%eax,%r12d
	rol	$16,%r12d
	add	%r9d,%ebx
	xor	%ebx,%r13d
	rol	$16,%r13d
	add	%r12d,%esi
	xor	%esi,%r8d
	rol	$12,%r8d
	add	%r13d,%edi
	xor	%edi,%r9d
	rol	$12,%r9d
	add	%r9d,%eax
	xor	%eax,%r15d
	rol	$16,%r15d
	add	%r10d,%ebx
	xor	%ebx,%r12d
	rol	$16,%r12d
	add	%r15d,%esi
	xor	%esi,%r9d
	rol	$12,%r9d
	add	%r12d,%edi
	xor	%edi,%r10d
	rol	$12,%r10d

到了这里,关于perl 语言中 AUTOLOAD 的用法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • perl脚本语言学习1——基础篇:变量、数组、哈希数组、循环、文件、函数

    2023.3.18 今天下载虚拟机把电脑磁盘内容弄到乱七八糟,难受 发现每次学习遇到一个坎,感觉面前是一座大山,越过去之后又对前途充满了希望 perl:practical extraction report language 实用提取和报表语言 从字面上看主要与文本处理相关 变量定义: my 存储 数字、字符、字符

    2024年02月12日
    浏览(70)
  • 1762_gcc编译c语言makefile自动生成工具的Perl实现

    全部学习汇总: GreyZhang/g_makefile: Learn makefile from all kinds of tutorials on the web. Happy hacking and let\\\'s find an common way so we may don\\\'t need to touch makefile code any more! (github.com)          前阵子实现了一个CodeWarrior嵌入式开发环境的自动编译环境,用的基本上是Python。说起来,我觉得那个环

    2024年02月12日
    浏览(75)
  • IIS perl python cbrother php脚本语言配置及简单测试样例程序

    上篇笔记写了 IIS 配置 CGI, IIS CGI配置和CGI程序FreeBasic, VB6, VC 简单样例_Mongnewer的博客-CSDN博客 这篇在IIS上配置一些脚本语言。为了操作方便,每种语言在站点下分设文件夹。 1. IIS perl配置 Perl CGI方式是曾经流行的做法。先下载一个开源的 Perl.exe 解释器,在免费的 sambar 服务器

    2024年02月09日
    浏览(43)
  • x-cmd pkg | perl - 具有强大的文本处理能力的通用脚本语言

    Perl 是一种动态弱类型编程语言。Perl 内部集成了正则表达式的功能,以及巨大的第三方代码库 CPAN;在处理文本领域,是最有竞争力的一门编程语言之一 生态系统 :综合 Perl 档案网络 (CPAN) 提供了超过 25,000 个开源模块。 跨平台 :可以在不同的平台上安装和运行,例如 Windows,

    2024年01月24日
    浏览(47)
  • ThinkPHP5源码阅读-类的自动加载register与autoload的实现

    本文已收录于PHP全栈系列专栏:PHP快速入门与实战 ThinkPHP是国内最流行的一款PHP框架,是国人自主研发的框架,起源于2006年,经过了十几年的不断发展。已经成为了一款被PHP广泛认可的性能开发效率兼具的利器。 阅读框架源码有助于我们更好的学习语言基础,拓展设计模式

    2024年02月08日
    浏览(42)
  • mysql 安装问题 perl(JSON) is needed by mysql-community-test

    执行命令 :yum install perl-JSON 进行在线安装即可解决

    2024年02月07日
    浏览(47)
  • 从0开始学OpenSSL 第一期:在VSCode中配置C语言调用OpenSSL

    由于一些项目上的需要,我要在C语言中调用OpenSSL库,本人并非0基础,至少在上个学期学习了一门必修的程序设计(C语言)。 本人开发环境为: 系统:Windows 11 开发工具: VScode + MinGW(GCC)v10.2.0 OpenSSL版本:Win64 OpenSSL v3.0.7 安装 OpenSSL 由于编译 OpenSSL 太麻烦了,这里我们直

    2024年02月05日
    浏览(105)
  • C语言---不依赖openssl的SHA算法

    //SHA1相关函数// typedef struct SHA1Context { uint32_t Intermediate_Hash[SHA1HashSize/4]; /* Message Digest / uint32_t Length_Low; / Message length in bits / uint32_t Length_High; / Message length in bits / / Index into message block array / int_least16_t Message_Block_Index; uint8_t Message_Block[64]; / 512-bit message blocks / int Computed; / Is the di

    2024年01月21日
    浏览(36)
  • pip cryptography 遇到的 OpenSSL 问题

    pip install -r requirements.txt 遇到 bug           一眼抓 OpenSSL,如果是Windows 64 位系统,下载“Win64 OpenSSL”安装程序。 Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions (slproweb.com) https://slproweb.com/products/Win32OpenSSL.html         直接安装 openssl 安装包是最快捷方便的方法

    2024年02月09日
    浏览(70)
  • intel SGX学习笔记(10):SGX项目openssl在App和Encalve中使用的配置问题和openssl库的路径配置问题

    我在初学SGX项目中,在安全区和非安全区下载和引入openssl库的时候会遇到各种各样的问题,稀奇古怪的,尤其是openssl的路径问题和make指令编译出现的问题,自己也做了几天的尝试解决,下面是我做出的一些解决方法,最终还是解决问题了,不对的地方请大家指点!!! 1、

    2024年01月23日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包