如何内联 Perl 子例程?

2023-11-21

我在读代码完成 2,其中提到的一点是关于创建子例程,即使是对于看起来太简单而无法拥有自己的子例程的操作,以及这有何帮助。

我知道我可以C 和 C++ 中的内联函数使用inline关键词。但我从未遇到过在 Perl 中内联子例程的方法。

有没有办法告诉 Perl 解释器内联子例程调用(或者为什么不呢)?


常量子例程,即具有空原型和常量返回值的子例程,是内联的。就是这样constantpragma 定义常量:

sub five() { 5 }

如果在第一次使用之前看到它,则会被内联。

否则,Perl 允许在运行时动态重新定义子例程,因此内联不适合。

对于给定相同输入总是返回相同值的子例程,您可以使用记忆化.

Perl 编程第 13 章提供了有关所采取的优化步骤的一些信息perl.

这称为恒定折叠。常量折叠并不限于简单的情况,例如在编译时将 2**10 转换为 1024。它还解析函数调用——满足第 6 章子例程中“内联常量函数”部分的标准的内置子例程和用户声明的子例程。让人想起 FORTRAN 编译器对其自身内在函数的臭名昭著的了解,Perl 也知道在编译期间要调用哪些自己的内置函数。这就是为什么如果您尝试取 0.0 的对数或负常量的 sqrt,您将引发编译错误,而不是运行时错误,并且解释器根本不会运行。

也可以看看perldoc perlguts.

大家可以自己看看不断折叠的效果:

#!/usr/bin/perl

use strict; use warnings;

sub log_ok () { 1 }

if ( log_ok ) {
    warn "log ok\n";
}

perl -MO=Deparse t.pl  

Output:


sub log_ok () { 1 }
use warnings;
use strict 'refs';
do {
    warn "log ok\n"
};
t.pl syntax OK  

在这里,不断的折叠导致了更换if块与do阻止,因为编译器知道log_ok总是会返回一个真值。另一方面,与:

#!/usr/bin/perl

use strict; use warnings;

sub log_ok () { 0.5 > rand }

if ( log_ok ) {
    warn "log ok\n";
}

分离输出:


sub log_ok () {
    use warnings;
    use strict 'refs';
    0.5 > rand;
}
use warnings;
use strict 'refs';
if (log_ok) {
    warn "log ok\n";
}
t.pl syntax OK  

A C编译器可能已经替换了if (log_ok) with if ( 0.5 > rand ). perl不这样做。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何内联 Perl 子例程? 的相关文章

  • 如果我将一个大函数声明为内联函数怎么办?

    我搜索了一些相关问题 例如C 中内联函数的好处 https stackoverflow com questions 145838 benefits of inline functions in c 但我还有疑问 如果内联函数只是为了 为编译
  • 哪一个代表null? undef 或空字符串

    我想插入null在表的一列中 哪一个代表null undef或空字符串 应该使用哪一种 为什么 我知道关于defined我可以检查一下 但我更多的是从数据库的角度来看 代表哪一个null更合适吗 Update 我在用DBI module D
  • 如何拆分一行并重新排列其元素?

    我在一行中有一些数据 如下所示 abc edf xyz rfg yeg udh 我想呈现如下数据 abc xyz yeg edf rfg udh 以便打印备用字段并用换行符分隔 有没有这样的衬里 下列awk脚本可以做到这一点 gt echo
  • 如何使用 Perl 从 NCBI 获取 FASTA 核苷酸格式的基因特征?

    我可以手动下载 FASTA 文件 如下所示 gt lcl CR543861 1 gene 1 ATGCTTTGGACA gt lcl CR543861 1 gene 2 GTGCGACTAAAA 通过单击 发送到 并选择 基因特征 FAST
  • 如何设置 $!在 Perl 中

    我想在 perl 中编写一些设置 的函数 与内置 perl 函数类似 当我尝试执行此操作时 它抱怨 参数 无法创建管理员用户 在标量分配中不是数字 我试过用谷歌搜索这个 但不幸的是谷歌不会在 所以结果很难得到 if createUser a
  • 使用 Getopt::Long 解析参数的最简洁方法

    我使用 GetOpt 来解析命令行参数 我想添加一个新选项 multi 它应该得到一个如下所示的字符串 key1 abc key2 123 key3 xwz 我不知道用户想要提供多少个自定义密钥 但他可以提供 minimax5键 另外 我想
  • Perl 中字符串之间的字符匹配计数

    我有一个字符串 例如字符串 1 需要与另一个字符串 字符串 2 匹配 两个字符串的长度相同并且不区分大小写 我想打印两个字符串之间的字符匹配数 E g String 1 stranger String 2 strangem Match co
  • 如何在 Perl 脚本中包含另一个文件中的函数?

    这似乎是一个非常简单的问题 但不知何故 我的 Google Fu 失败了 在 Perl 中包含其他文件中的函数的语法是什么 我正在寻找类似C的东西 include blah h 我看到了使用 Perl 模块的选项 但这似乎需要对我当前的代码
  • 由于 lpcap,CPAN 安装 Net::Pcap 和 Packet 模块失败

    最近 我尝试通过 cpan 安装 perl 模块 Net Packet 和 Net Pcap 但它抱怨找不到 pcap 库 所以我正在搜索 cpan 在安装模块时是否接受外部 lib include 目录 但到目前为止还没有运气 looki
  • MIME::Lite - 无法发送邮件 [smtp.gmail.com 不支持 SMTP auth() 命令]

    use MIME Lite use warnings use MIME Base64 use Authen SASL use MIME Lite use MIME Base64 use Authen SASL use warnings us
  • 我怎样才能挂钩 Perl 的 use/require 以便抛出异常?

    如果文件已经加载 是否可以挂载到use require所以我可以抛出异常 在我即将到来的nextgen blacklist http github com EvanCarroll nextgen blob blacklist lib nex
  • 内联函数以及类和头文件

    头文件中定义的任何函数都会自动内联吗 如果我在类中声明一个函数并使用关键字 inline 在外部给出定义 那么这个函数会是内联的吗 如果是 为什么这不违反内联函数应在声明时赋予主体的法律 类定义中定义的任何函数都是内联的 任何标记的功能in
  • 如何用perl逐句读取文本文件?

    我想逐句读取文本文件 我的问题是下面的代码仅根据时期分开 usr bin perl use strict use warnings my file data txt open FILE file my buffer while my sen
  • 在 Ubuntu 中执行 .cgi 文件

    我在 Ubuntu 下运行 Apache PHP 当我运行 cgi 文件时 通过http localhost mycgi cgi 浏览器将显示代码而不是运行它 如何让浏览器执行 CGI 文件而不是显示其内容 将这些行添加到您的 apache
  • 在 Perl 中使用数据引用的正确方法

    我有一组想要处理的数据 为了简化我的代码 最好通过指向原始数据的引用数组来访问我的数据的某些子集 比解释更好的是 我写下了这个例子 它还没有工作 最后 我想更新原始数据 而不必更新所有子集 用 Perl 可以做这样的事情吗 usr bin
  • Perl:HTTP::微小删除留下损坏的锚标记

    我编写了一个脚本 该脚本收集从数据库读取的缓冲区内的所有 URL 检查该页面是否仍然存在 并使用 HTTP Tiny 从缓冲区中删除 URL 如果该 URL 无法访问或返回无效 问题是 HTTP Tiny 删除左锚标记 例如此处无效的文本
  • 检查一个数字是 int 还是 float

    在perl中 我想检查给定变量是否包含浮点数 为了检查我正在使用的 my Var 0 02 Floating point number if int Var Var floating point number 但上面的代码对于 0 0 不起
  • 如何在 Perl 中复制整个目录?

    我需要将整个目录复制到某个位置 最好的方法是什么 File Copy正如我所见 仅逐个文件复制 顺便说一句 我在Windows下工作 感谢帮助 也许调查一下文件 复制 递归 http metacpan org pod File Copy R
  • Perl LWP GET 或 POST 到 SNI SSL URL

    我有一个使用 perl LWP 向客户发送数据的系统 他们可以选择 URL 以及是 POST 还是 GET 一位新客户最近抱怨该服务不起作用 他们怀疑这是因为他们的端点使用了 SNI SSL 查看日志 我看到的只是错误消息 证书验证失败 5
  • Perl:正则表达式不抓取代码中的多行 C 风格注释

    我有一个 Perl 程序 读取用 C 编写的 SRC 文件 使用 SRC 文件中的正则表达式匹配来查找特定格式的数据以用作目标文件名 打开新的目标文件 执行另一个正则表达式匹配以查找包含关键字 abcd 的所有 C 风格注释 注意 这些注释

随机推荐

  • React Native:在 Jest 单元测试中模拟离线设备

    我正在编写一个 React Native 应用程序 并使用 Jest 来对我的代码进行单元测试 我编写了一个函数来检查是否有互联网连接 我知道想要编写它的单元测试 我陷入困境 因为我无法弄清楚如何在单元测试中模拟设备的连接状态 您如何在单元
  • 没有名为 django.core 的模块

    卸载旧 Django 版本后 我已更新到最新的 Django 版本 1 0 2 但是现在当我运行 django admin py 时 出现以下错误 我该如何解决这个问题 Traceback most recent call last Fil
  • 多个(超过2个)数字的最大公约数

    我正在寻找最简单的解决方案来获得多个值的最大公约数 就像是 x gcd array 30 40 35 Should return 5 x gcd array 30 40 Should return 10 你会如何解决这个问题 非常感谢 gc
  • 在服务器端实体框架 5 上生成 Guid?

    我来自 nhibernate 背景 我想知道如何在服务器端自动生成 Guid 而不是在数据库端进行往返 在流利的休眠中 这很简单 Id x gt x Id GeneratedBy GuidComb 如果您想在服务器上生成密钥 只需在代码中执
  • 在应用程序内购买时显示消息“您已经拥有该商品”。在安卓中

    我正在尝试在应用程序内实现 在android中 应用程序内运行完美 但是 当我remove来自设备的应用程序和重新安装它 然后如果我尝试购买 它会显示此消息 product is Managed and in app API Version
  • Android:更改微调器下拉视图

    Im My application I want the below type of Spinner Dropdown view For this type of spinner view I wrote this code ArrayAd
  • 在 C# 中复制 T-SQL DecryptByPassPhrase

    我想要创建一个 C 类来解密使用 T SQL 的 EncryptByPassPhrase 加密的字节数组 是的 我知道我可以在 SQL Server 中解密 但我需要的是能够在数据库层和中间层中同等地加密 解密 据我所知 SQL Serve
  • 为什么 window.showModalDialog 被弃用?用什么代替?

    我正在开发一个 GreaseMonkey 脚本 它使用window showModalDialog 但还没完成 我就发现Firefox 29发出了警告 不推荐使用 window showModalDialog 使用 window open
  • R Shiny 使滑块值动态化

    我有一个下拉选择器和一个滑块刻度 我想用下拉选择器作为数据源来渲染一个图 我已经让这部分工作了 我只是希望滑块的最大值根据选择的数据集进行更改 有什么建议么 server R library shiny shinyServer functi
  • 在 Pyspark 中按列分组并筛选具有最大值的行

    我几乎可以肯定这个问题之前已经被问过 但是通过 stackoverflow 进行搜索没有回答我的问题 不是重复的 2 因为我想要最大值 而不是最频繁的项目 我是 pyspark 的新手 尝试做一些非常简单的事情 我想按 A 列进行分组 然后
  • 如何在 Android 手机上找回已登录的 Google 帐户?

    我正在开发一个 Android 应用程序 我需要检索手机上使用的 Google 帐户 我想为 C2DM 执行此操作 但我不想要求用户输入他 她的 Google 电子邮件帐户 如果他们已经登录 有什么方法可以做到吗 像这样的东西应该有效 Ac
  • 在 ASP.Net Web Api 2 中使用 PUT 动词上传文件

    我想使用 HTTP PUT 动词公开 ASP Net Web Api 2 操作来上传文件 这与我们的 REST 模型一致 因为 API 代表远程文件系统 类似于 WebDAV 但确实简化了 因此客户端选择资源名称 因此 PUT 是理想的 P
  • Android Studio 3.6.1 构建问题

    我刚刚更新了android studio3 6 1 这次更新后 我更新了所有插件 现在 Gradle 同步失败 请检查以下错误 Caused by org gradle tooling BuildException Failed to pr
  • 如何刷新/重新加载应用程序/pdf 的嵌入?

    我有一个使用 application pdf 的嵌入代码来在页面上显示 pdf 文档 我使用 javascript 更改嵌入的 src 属性 单击该链接 然后使用警报确认 src 确实发生了变化 但页面上仍然显示相同的 pdf 如何刷新 重
  • JDK 1.8(C:\...)没有附加IDEA注释,有些问题将无法发现

    在 Android Studio 3 1 2 中 我突然在编辑器顶部的黄色胶带框中收到以下消息 JDK 1 8 C Program Files Android Android Studio jre 没有附加IDEA注释 一些问题将无法发现
  • 具有基于休息的服务的 WSDL 有什么意义?

    如果基于 REST 的 Web 服务就像 GET 和 POST 到 URL 并解析响应一样简单 那么我们究竟需要一个 wsdl 吗 重点是什么 我知道 当使用基于 SOAP 的服务时 它用于构造 SOAP 请求和响应 但并没有真正理解为什么
  • 1GB 内存中可以创建多少个整数?

    在 Robert Sedgewick 所著的 算法 第四版第 200 页中 它说 例如 如果计算机上有 1GB 内存 10 亿字节 则无法容纳超过 3200 万个 int 值 计算后我很困惑 1 000 000 000 字节 4 字节 2
  • 如何停止日志中的堆栈跟踪截断

    很多时候 我会在 Java 日志中得到类似以下内容 Caused by java sql BatchUpdateException failed batch at org hsqldb jdbc jdbcStatement executeB
  • 如何获取img src值

    我的 div 标签中有一些内容 在该 div 标签内容中 我必须搜索 img src 标签值 基于该值我必须突出显示一些图像并显示一些 div 内容 例如 如果 img src 值包含 http google com test test i
  • 如何内联 Perl 子例程?

    我在读代码完成 2 其中提到的一点是关于创建子例程 即使是对于看起来太简单而无法拥有自己的子例程的操作 以及这有何帮助 我知道我可以C 和 C 中的内联函数使用inline关键词 但我从未遇到过在 Perl 中内联子例程的方法 有没有办法告