为什么即使使用前向声明,我也不能在 BEGIN 块中调用稍后定义的 sub?

2023-12-11

这有效:

use strict;
X("xxxxxx");
sub X { print shift;}

这会产生一个错误:

use strict;
BEGIN {
    X("xxxxxx");
}
sub X { print shift;}

Error:

Undefined subroutine &main::X called at ./test.pl line 5.

这是有道理的,因为执行 sub 时我们正处于编译阶段的中间......所以编译器还没有到达 sub 声明/定义。

... 但:添加前向声明(在 BEGIN 块之前或其中)没有帮助:

use strict;
sub X;
BEGIN {
    X("xxxxxx");
}
sub X { print shift;}

为什么在 BEGIN 块中调用函数时前向声明不起作用?我假设它发生在编译阶段,方式my声明确实如此。

perldoc perlsub似乎没有任何亮点。


A BEGIN block is executed as soon as it has been parsed. This means that perl has'nt seen the definition of the sub yet1. Your only solution is to define the function before it's used:

sub foo { print shift }
# When the parser reaches this point, the "foo" sub has been compiled

BEGIN {
    # Ergo, "foo" can be used here
    foo("xxx");
}
# The BEGIN block is executed once the parser arrives here

您还可以选择稍后执行的移相器,例如INIT:

INIT {
    foo("xxx");
}

sub foo { print shift }

BEGIN和朋友记录在perldoc perlmod


  1. 像这样的预声明sub foo;仅在原型上下文中为解析器提供指导,以及裸字与子例程调用消歧。它不会使解析器跳转到实际定义。由预声明生成的子例程存根实际上不可调用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么即使使用前向声明,我也不能在 BEGIN 块中调用稍后定义的 sub? 的相关文章

  • 如何在 Perl 中的不同包之间共享全局值?

    是否有一种标准方法可以对模块进行编码以保存要包含在每个其他包中的全局应用程序参数 例如 use Config 一个简单的包 只包含our变量 只读变量怎么样 已经有一个标准配置模块 http perldoc perl org Config
  • 无法在 Mac 上安装 DBD::mysql

    第一次发帖 格式可能不太对 请见谅 我一直在尝试使用 cpan 在 macOS Catalina 上安装 DBD mysql 但尚未成功 我使用了perlbrew 并尝试了mysql和mariaDB 但仍然没有成功 另外 我在网上研究了不同
  • 从 shell 脚本调用 Perl,如何将返回值从 Perl 传递到 shell?

    我成功地从 shell 脚本调用 Perl 脚本 现在我想将 Perl 脚本的返回值传递给 shell 脚本 指示它是否成功 我该怎么做呢 只需使用适当的退出值退出 Perl 脚本即可 exit exit value exit 0 if p
  • 在 Perl 中组装 XML

    我需要对 NetApp 文件管理器进行 API 调用 我知道我需要发送什么原始 XML
  • 更新命令行输出

    我的程序 碰巧是用 Perl 编写的 尽管我不认为这个问题是 Perl 特定的 在程序中的某一点输出状态消息 Progress x yy where x and yy是一个数字 例如 Progress 4 38 我想在打印新的状态消息时 覆
  • 真实设备中的 Android strace

    我有以下情况 我想监控Android手机上的系统调用 所以 我编写了一个脚本来做到这一点 使用 Android 模拟器可以完美地工作 将应用程序的痕迹写入我的 Ubuntu 上的特定文件中 问题是当我连接一个真实的手机来分析它时 它在结果文
  • Perl 脚本(或任何东西)来合计 CSV 列

    我写了 在其他人的很多帮助下 awk command https stackoverflow com questions 4159224 excel and awk disagree about csv totals 4159404 415
  • Perl Moose TypeDecorator 错误。我该如何调试?

    我最近遇到了一个问题 非常感谢您的见解 我在圣诞节前在 PerlMonks 上发布了类似的问题 并提供了一些从 MooseX Declare 切换的反馈 http www perlmonks org node id 877703 1 我现在
  • Perl 中如何释放内存?

    我的代码如下所示 my var my var new while 1 while my k v each var a sub v var A map var var new keys var new var new B sub a sub
  • 如何在正则表达式中匹配“/*”?

    stuff d learning perl tmp txt open STUFF stuff or die Cannot open stuff for read while
  • Perl 中的布尔函数应该返回什么值?

    简短的问题 在 Perl 代码库中一致表示真假的最佳方法是什么 1 0 1 Perl 原生布尔运算符的特殊空字符串 return undef 即空列表 问题背景 我们都知道 Perl 在布尔值方面非常灵活 就像大多数事情一样 例如 Perl
  • 这可以一行完成吗?

    我像这样提取MAC地址 my tmp split domain 123 123 123 123 at 00 11 22 33 44 55 ether on eth0 my vip tmp 3 但不使用临时变量可以完成吗 是的 它可以 my
  • Perl:LWP::UserAgent 对于重定向 URL 始终返回代码 200

    我有一个简单的 url 它执行 302 临时错误 移至另一页 我尝试在 URL 返回代码 200 表示 OK 时检索它 并在返回 200 以外的其他内容时停止 My code my ua LWP UserAgent gt new env p
  • 如何为不同的 Perl 应用程序安装专门的环境?

    就功能而言是否有与 Python 相同或接近的东西虚拟环境 http pypi python org pypi virtualenv what it does 但是对于 Perl 来说呢 我已经用 Python 进行了一些开发 并且将非系统
  • Path::Class::File 或 ::Dir & Moose 初始化和强制

    目前有 package Local use warnings use Moose use Method Signatures Simple use Path Class File use Path Class Dir method buil
  • unix df 上的正则表达式帮助

    我需要一些帮助来调整我的代码以查找此 UNIX 中的另一个属性df output Ex Filesystem Size Used Avail Capacity Mounted on dev ad4s1e 61G 46G 9 7G 83 ho
  • 如何确保我的代码永远不会直接退出?

    eval require file subsequent code goes here If file包含一个exit语句 后面的代码就没有机会运行 如何解决以便后续代码始终有机会运行eval已经完成了 中止是不可能的exit call f
  • 为什么我只得到第一个捕获组?

    https stackoverflow com a 2304626 6607497 https stackoverflow com a 2304626 6607497 and https stackoverflow com a 370042
  • perl-5.10 之前的高效版本相当于 pack("Q>")

    更新 萨尔瓦正确地指出我对 Q 包模板的介绍是错误的 这是 gt 修饰符 不会返回到 5 8 Perl 5 10 引入了 pack 修饰符 gt 对于我使用 Q 的用例 它将一个无符号四边形 64 位 值打包在大尾数法 现在 我正在寻找一个
  • Perl 的 caller() 函数返回错误的行号

    我在 Perl 5 10 1 上运行了以下脚本 usr bin perl use strict use warnings foreach my x 0 x lt 1 x Line 5 print line Line 6 sub print

随机推荐

  • 如何在seaborn中使用预先计算的平均值、中位数、百分位数等值创建箱线图?

    我想在seaborn或matplotlib中创建一个箱线图 我可以在其中手动输入箱线图的值 而不是从数据集计算这些值 我正在尝试将实际数据与目标值进行比较 因此我想将这些目标显示为箱线图 然后覆盖实际数据点的群图 例如 我有一个具有不同补偿
  • Scala 中的 MapView(<未计算>)

    我开始学习 Scala 但我发现了一个令人困惑的问题map 我的代码是这样的 val mymap Map 1 gt james 2 gt justin println mymap view mapValues x gt hi x print
  • 出于测试目的访问原始装饰函数

    我正在使用装饰器 render to来自django annoying包 在视图函数中 但问题是我想获取视图函数返回的原始字典用于测试目的 而不是HttpResponse装饰器返回的对象 装饰器使用 wraps from functools
  • JavaFX 2 TableView:根据单元格内的数据不同的单元格工厂

    我正在尝试使用表视图来渲染 编辑 键 值 对 因此该表应该有两列 键 和 值 Key只是一个普通的字符串 value可以是任何东西 我的问题是 行与行之间的值的数据类型可能不同 基本上 我想使用布尔值的复选框和列表的选择 我找到了一种通过设
  • 如何在 PyQt 中创建“色环”?

    我想创建一个如下所示的 QWidget QDialog 色环 or Windows 颜色选择器 我知道QColorDialog 但我不想使用它 我知道这是一个老问题但由于唯一的答案性能相当糟糕 这是我的版本 它使用两个叠加的渐变 而不是单独
  • 仅当源级别为 5.0 时注释才可用 语法错误 java

    我正在编译一个普通的java程序 Override注释 我从一些教程中从互联网下载了源代码 现在javac正在抱怨 annotations are only available if source level is 5 0 SO 或其他网站
  • 文本在 li 内垂直对齐

    ul li img src Content img pdf png Catalogue li li img src Content img pdf png Manual Data li li img src Content img pdf
  • Google 应用脚本触发器 ID 格式

    我正在开发 Google 电子表格项目 通过脚本添加 删除基于时间的触发器 所有触发的触发器都将运行一个函数 该函数将检查其 Id 并相应地运行函数 我正在保存启动触发器并使用此代码保存它的 id function startTimer r
  • Altair 中的平行坐标

    我想做一个具有多个 y 轴的平行坐标图 我已经找到了如何在 Vega Lite 中做到这一点here但我还没有找到使用 Altair 的方法 只有一个非常简单的例子其中所有 y 轴都相同 有什么办法吗这个情节在牵牛星 请注意 这种图表不是
  • 真实用户ID、有效用户ID和保存用户ID之间的区别

    我已经知道真实用户ID 它是系统中用户的唯一编号 在我的系统上 我的uid is echo UID 1014 另外两个ID代表什么 以及有什么用有效用户id and 已保存的用户 ID我们在系统中的什么地方使用它们 区分真实用户 ID 和有
  • 在iOS7半透明导航栏中获取正确的颜色

    如何为 iOS 7 中的半透明导航栏获得正确的颜色 导航栏只是将给定的颜色调整为更亮的颜色 更改颜色的亮度或饱和度也无法提供正确的结果 有人有同样的烦恼吗 看看 Facebook 它似乎以某种方式起作用 他们有自己的颜色和半透明的导航栏 编
  • SSIS 循环遍历 Excel 工作表

    我正在使用SSIS2012 我试图将大约25个excel文件 每个文件包含大约70个 变量 表 导入到SQLserver2008中 我已经构建了它 以便它将循环遍历所有 Excel 工作表并导入第一个工作表 但这没有用 我如何循环所有 Ex
  • 将文件直接上传到 GAE 应用的 Google Cloud Storage

    我正在考虑从 Blobstore 切换到 Google Cloud Storage 以处理项目中的图像上传等问题 因为 Google 称 Blobstore 为 取代 在 Blobstore 中 多部分表单将直接提交 上传 到 Blobst
  • 在 ansible playbook 中使用 gitlab-ci vars

    我想使用 Ansible playbook 在 docker 容器内设置远程环境 该剧本将从 gitlab ci 运行 其中包含我在 Gitlab CI CD 配置中设置的变量 我怎样才能做到这一点 这是我想使用的模板 我该如何设置user
  • C 中的常量返回类型

    我正在阅读一些代码示例 它们返回了 const int 当我尝试编译示例代码时 出现了有关返回类型冲突的错误 所以我开始搜索 认为 const 是问题所在 当我删除它时 代码工作正常 不仅可以编译 而且按预期工作 但我从未能够找到专门与 c
  • 查找字符串中长度最大的所有单词

    我想从字符串中找到长度最大的所有单词 目前 结果只是第一个长度最大的 jumped1 而我想要它们全部 jumped1 jumped2 我该如何调整以下内容 function test str var newStr str split va
  • 同步多个 UITableView 实例的滚动位置

    我有一个项目 我需要在其中显示多个UITableViewiPad 上同一视图内的实例 它们也恰好被轮换 但我相当确定这是无关紧要的 用户应该不知道视图是由多个表视图组成的 因此 我想做到这一点 以便当我滚动一个表视图时 其他表视图也会同时滚
  • Hibernate Envers:跟踪 OneToMany 关系拥有方的修订

    我有两个经过审计的实体 A 和 B 实体 A 拥有实体 B 的集合 注释为一对多关系 将 A 的新实例插入数据库时 A 和 B 的所有行都处于同一修订版 假设为修订版 1 然后 A 上有更新 仅影响实体 B 的实例 级联类型为合并 因此 更
  • 如何使用 Puppeteer 访问 React 事件处理程序

    我不完全确定我明白我的要求 我希望有人能解释一下 我正在尝试在 NodeJS 上使用 Puppeteer 抓取网站 我已经选择了我需要的元素并访问它的属性 但是 我无法访问我需要的属性来提取我想要的信息 我想要的信息在下面的绿色框中 但是我
  • 为什么即使使用前向声明,我也不能在 BEGIN 块中调用稍后定义的 sub?

    这有效 use strict X xxxxxx sub X print shift 这会产生一个错误 use strict BEGIN X xxxxxx sub X print shift Error Undefined subroutin