代码之家  ›  专栏  ›  技术社区  ›  friedo

在Perl中,check、unitcheck和init块有什么用处?

  •  14
  • friedo  · 技术社区  · 15 年前

    我知道他们都在做什么,但我从未发现自己处于一种我需要他们中任何一个的境地。我用过 BEGIN 在许多情况下阻塞 END 偶尔。 开始 当您需要在代码运行之前调整环境时尤其有用,而且我已经使用了 结束 在某些调试情况下,为了难以跟踪致命错误而捕获重要的状态信息。

    你用过吗 CHECK , UNITCHECK INIT ?如果是,为什么?会吗? 开始 由于某种原因,块还不够?

    块的文档已打开 PerlDoc .

    4 回复  |  直到 13 年前
        1
  •  5
  •   mob    15 年前

    我有一个包裹 import 做一些重负荷处理,然后使 eval 打电话。如何调试类似的东西?当您 use 在编译时发生的模块(就像它在begin块中一样)。出于某种原因(我认为这是因为我需要将参数传递给 进口 用Heredoc符号,但它可能是其他东西),这还不够好 require Module; Module->import(@args) .

    所以我的解决方法是为 埃瓦 在里面 进口 ,并保存另一个变量。 然后我跑了 埃瓦 在一个 INIT 块。运行调试器时,第一个执行点位于 初始化 块,我可以使用调试器单步执行 评估 语句。

        2
  •  7
  •   DVK    15 年前

    检查块的一个有趣的用法是在SimonCozens(O'Reilly)的“高级Perl编程”中,在第1章的“稍后使用检查做事情”部分中。他演示了如何实现“最终”类Java属性。

    此外,devel::sub::trace使用init块来导入跟踪(此信息来自devel::hook的pod,后者是用于处理这些命名块的模块)

        3
  •  3
  •   Axeman maxelost    15 年前

    BEGIN 块在编译时运行,如您所知。所以我将它保存在需要运行的代码中,以便导入我的模块。

    我编写了一个脚本包装器,来完成在样板代码中完成的所有工作,这些代码发生在几百个脚本中。

    • 我要做的事情就是让模块阅读 use -D.我跑了进去 开始 砌块和 import 附属的。
    • 但也有所有的样板 初始化 脚本将使用的服务。因此,我在 INIT 阻碍。
    • 并在 END 阻碍。

    我认为,如果您使用XS引擎编写模块,那么检查是有意义的,但我只使用过几次。有一次我想是在 影印版 . 我不能马上记住其他的原因。

    但我用 初始化 当我觉得代码更多地是脚本的一部分,而不是设置模块时阻塞。本质上,我只做编译期间必需的事情。

        4
  •  1
  •   rurban    13 年前

    佩洛莫 解释那些特殊的块,但实际上只有 BEGIN END 是常用的。 它们只是cvs、lifo或fifo的数组。 这些块允许在运行代码时独立于源文件中的位置进行单独计时。所以您可以将代码段放在一起,但它们是在不同的时间执行的( PHASES )。

    检查 最初添加以运行编译器套件 o ( -MO=C... )在模块初始化之后(使用包),在主程序之前,以固定的顺序存储执行上下文。这将编译时间(之前)与运行时间(之后)分开。 perl -c 检查后停止。

    因为我是编译器的维护者,所以我广泛使用check和-mo=我的模块 compile() 方法由调用 o 在检查块中。用 外径 ( o调试 我称之为 compile 方法不在检查中,但稍后在in it中,因此调试器将进入该方法。默认情况下,调试器不会单步执行检查块,您必须使用 $DB::single=1 或使用 外径 .

    统一检查 后来被添加到细粒度模块的编译和加载中,特别是。 .pmc 文件夹。

    到目前为止我还没用过。它也可以在运行时发生,所以我可以将它用于运行时加载模块的类型检查。

    初始化 然后添加以允许单独的类初始化。

    我很少用它,但它很方便。