Perl 5.12.2 在 @ISA 上使用 splice 是否有问题?

2024-02-18

以下是 Perl 5.12 上的调试会话。这有意义吗?做UNIVERSAL缓存一个版本@ISA变量,如果永远使用此后。回到之前Class::ISA http://search.cpan.org/perldoc?Class%3a%3aISA已被弃用,我曾经打电话过Class::ISA::self_and_super_path让内部结构重新审视@ISA大批。既然现在认为没有必要,那么如何让perl审计其内部记录呢?

DB<34> p $papa
Papushka=HASH(0x16bc0300)

DB<35> p $papa->isa('Nanushka')

DB<36> p $papa->isa('Babushka')
1

DB<37> x @Papushka::ISA
0  'Nanushka'
1  'Babushka'

这是测试代码(显然)。它得到相同的结果,运行平坦,作为测试运行,或在调试中运行。我应该告诉你 在此之前@ISA = qw<Babushka>我表演了

splice( @ISA, 0, 0, 'Nanushka' );

这是问题所在吗?你是否应该只push onto @ISA?


替代品为Class::ISA::self_and_super_path is mro::get_linear_isa。这可以从mro本身,或者,如果你想支持旧的 perls,通过MRO::Compat.

Also, @ISA是一个神奇的变量。

$ perl -MDevel::Peek -e'Dump \@ISA'
SV = IV(0x1b92e20) at 0x1b92e28
  REFCNT = 1
  FLAGS = (TEMP,ROK)
  RV = 0x1bbcd58
  SV = PVAV(0x1b93cf8) at 0x1bbcd58
    REFCNT = 2
    FLAGS = (SMG,RMG)
    MAGIC = 0x1bc0f68
      MG_VIRTUAL = &PL_vtbl_isa
      MG_TYPE = PERL_MAGIC_isa(I)
      MG_OBJ = 0x1bbcd40
    ARRAY = 0x0
    FILL = -1
    MAX = -1
    ARYLEN = 0x0
    FLAGS = (REAL)

请注意PERL_MAGIC_isa。这就是驱动这个特殊机制的原因。

每当它发生更改时,依赖于其值的任何缓存的内容都应该被更新。

$ perl -E'say Foo->isa(q[Bar]) || 0; @Foo::ISA = qw(Bar Baz); say Foo->isa(q[Bar]) || 0'
0
1

显然您已经发现了缓存失效不会发生的情况。我认为这是一个错误。机会是splice出于某种原因,不会调用isa适当地施魔法。你可以尝试修改@ISA以另一种方式,例如使用unshift或作业,或者可能尝试mro::method_changed_in,这将使方法解析缓存无效,这些缓存绑定到各种@ISAs.

如果您可以将此错误减少到最小的测试用例,那么这对于修复此错误将非常有帮助。

Update:

事实证明,一个最小的测试用例很简单:

$ perl -E'say Foo->isa(q[Bar]) || 0; splice @Foo::ISA, 0, 0, q[Bar]; say Foo->isa(q[Bar]) || 0'
0
0

这是由于pp_splice不做类似的事情mg_set((SV *)ary). push, unshift,并且常规作业可以正确执行此操作,因此使用其中之一应该可以解决您的问题。

另一个更新:

这个改变 http://perl5.git.perl.org/perl.git/commitdiff/474af99058f4c0fc3b80d73763da5b29c1ff8c66,我刚刚提交给 perl,解决了这个问题。然而,由于splice不调用魔法已经存在于 5.8 和 5.10 中,这不是回归,因此几个月后不会成为 5.12.3 的一部分。下周发布的 5.13.6 和明年北方春天的 5.14.0 可能会有它。

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

Perl 5.12.2 在 @ISA 上使用 splice 是否有问题? 的相关文章

  • 有没有办法在 C++ 中调用类外部的基函数?

    这个问题是类似的 但是是关于从类内部调用函数 如果我重写基类的虚函数 我可以调用它吗 https stackoverflow com questions 672373 can i call a base classs virtual fun
  • Perl 中的 Substr,将 utf8 字符切成两半

    我正在尝试解决使用时的问题substr在 Perl v5 8 5 中 这是一个示例字符串 UTF 8 示例 编辑 ff if length hit gt post title gt 60 hit gt post title substr h
  • Perl - 将数组元素句子与变量进行比较

    我使用 grep 返回临时F 文件和 arrayWarning 之间不匹配的数组 my c grep map 1 temporaryF arrayWarning c 里面有很多行 例如 Sun Sep 30 00 05 55 fibre c
  • 如何以 OO 风格打开管道?

    我用新风格重写了旧代码 如下所示 old style open FD file new style fh IO File gt new file r 文件没问题 但我不知道如何打开管道 read from pipes open PIPE s
  • PHP 中是否存在不调用析构函数的情况?

    这是我第一次在 stackoverflow 上发帖 但这些帖子对我帮助很大 无论如何 关于我的问题 是否有 PHP 中的析构函数未被调用的情况 我问的原因是因为我有一个映射器类 它将数据映射到对象 在构造函数中 我启动一个事务 在析构函数中
  • 代理模式和装饰者模式的区别

    你能给出任何好的解释吗 Proxy and 装饰者 我看到的主要区别是 当我们假设Proxy uses 作品 and 装饰者 uses 聚合那么似乎很清楚 通过使用多个 一个或多个 装饰器您可以修改 添加功能到预先存在的实例 装饰 而Pro
  • 如何在 Perl 中将纪元时间转换为正常时间?

    我正在尝试编写一个 Perl 脚本来解析日志 其中每行的第二个值是日期 该脚本接受三个参数 输入日志文件 开始时间和结束时间 开始时间和结束时间用于解析出每行上位于这两个时间之间的特定值 但为了正确运行这个 我将开始和结束时间转换为纪元时间
  • UML三元关联实现java代码[重复]

    这个问题在这里已经有答案了 三元关联是结构关系 指定一个事物的对象连接到其他两个事物的对象 我理解这种关系 但我不知道如何实现显示这三个类之间关联的方法 让我们考虑下面的例子 项目有许多使用特定编程的开发人员 语言促进发展 开发人员使用特定
  • 在 C++ 中类继承的情况下强制延迟方法解析

    考虑以下类结构 class foo public int fun cout lt lt in foo lt lt endl class bar class1 public foo public int fun cout lt lt in b
  • 如何删除 XML::Simple 输出中的 标记?

    我正在使用 Perl 创建一个 XML 文件 XML 简单 http search cpan org dist XML Simple模块 我成功创建了 XML 文件 但问题是我遇到了
  • Perl:名称“main::IN”仅使用一次,但实际上已使用

    我编写了一个读取文件的简短 Perl 脚本 看tmp txt 1 gene id XLOC 000001 gene name DDX11L1 oId 1 gene id XLOC 000001 gene name DDX11L1 oId 1
  • 在java中将对象声明为final

    有人可以澄清以下代码的意义吗 class A int i 10 public void setI int b i b public int getI return i class Test public static void main S
  • 使用 Perl 进行数据签名

    我参与了这个涉及发送签名数据的项目 我已经获得了一个 pem 文件和一个服务器证书 我应该将其导入到另一台服务器 我应该使用这些文件对数据进行签名 然后将签名的数据发送到另一台服务器进行验证和处理 我的问题是 如何将这两个文件导入到我的服务
  • Perl 使用什么哈希函数/算法?

    有人能解释一下 Perl 用于将字符串映射到索引的哈希函数 算法吗 有相关读物吗 这个答案早于 5 28 中进行的哈希函数更改 请参阅 默认哈希函数更改 perldelta 为 5 28 http perldoc perl org perl
  • 当代码依赖于两个对象的子类型时,是否有设计模式可以处理

    我会尽力尽可能明确 以防有比回答我的问题更好的解决方案 我正在使用 C 工作 我有一个报告模板 可以包含任意数量的打开的 功能 功能可能是信息表 饼图 条形图 列表等 我将报告生成为文本文件或 PDF 将来可能有其他选项 到目前为止我有一个
  • 处理在没有全局变量的情况下跨函数使用的变量

    所以我正在开发一个基本的文字游戏 你会得到一只字母 手 字典对象 你可以用它来创建单词并获得分数 这个 手牌 被用在许多函数的参数中 计算玩家的分数 在玩家使用一个或多个字母后更新手牌中的字母数量 显示手牌 检查玩家单词的有效性 ETC 从
  • 如何使PHP库松耦合? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 现实世界抽象类使用简单示例

    有没有使用抽象类的现实世界简单示例 我试图进入 PHP 的 OOP 但我仍然无法理解 为什么应该使用抽象类以及何时使用 是的 我知道不可能创建抽象类实例 只能创建继承它的类的实例 也许您有一个图像类 并且有 2 个驱动程序 GD 和 Ima
  • For 循环和词法作用域变量

    版本 1 use warnings use strict my count 4 for count 1 8 print Count count n last if count 6 if not defined count print Cou
  • 使用组合来表示“is – a”关系时出现的问题

    我正在为人力资源系统开发系统 有会计员工和程序员员工 加入公司的第一个月 员工没有被赋予任何角色 一名员工可以同时担任会计师和程序员 我有一个由以下代码所示的设计 现在 我需要通过实现新功能来增强系统 解雇所有会计师 终止意味着将员工的状态

随机推荐