gpt4 book ai didi

perl - 如何在 perl 脚本中包含 BEGIN 部​​分

转载 作者:行者123 更新时间:2023-12-01 04:54:13 25 4
gpt4 key购买 nike

我有一堆 perl 脚本,每个脚本都需要有一个相同的 BEGIN 部​​分,这将我们开发的 perl 模块的路径添加到 @INC。因为它不是一个子,我不能简单地调用它。目前我在每个 perl 脚本中都包含这部分,这显然是一个令人头疼的维护。有没有更简单的方法来包含 BEGIN 部​​分?

BEGIN
{
my $current_script_dir = File::Basename::dirname(File::Spec::Functions::rel2abs($0));

# Assume that the root of all libraries is two levels up from the directory of the
# script being run.

my $all_libs_root = File::Spec->canonpath("$current_script_dir/../..");

# Make sure the path is absolute,
$all_libs_root = File::Spec->rel2abs($all_libs_root);

unshift(@INC, "$all_libs_root");
}

最佳答案

是的。您可以简单地将该代码(将进入 BEGIN)放入一个新的 Perl 模块中。

package MyIncPathMaintenance;
push @INC, "something_bvaluable";
1;

那么,你所有的脚本只需要做:

使用 MyIncPathMaintenance;

作为 shebang 和 use strict

之后的第一行

这是可行的,因为 use XYZ 等价于 BEGIN { require XYZ; XYZ->import() } (source);而 require 将执行模块的代码(包括您的 @INC 操作),就好像它是 eval-ed ( source )。

BEGIN + @INC 更改相比,这种方法有很多好处:

  • future 它更易于维护。对路径的任何更改(或添加新路径)都会封装在模块中,而不是在大量脚本中复制/粘贴

  • 它封装了一些高级功能,对于那些不知道自己在做什么并且可能破坏它的初级开发人员来说可能有点危险(“嘿,我只需将我的主目录添加到这个路径,这样我就可以在没有核心审查/测试/发布 SDLC 的情况下运行我的 ad-hoc 库版本”)。

  • 它允许脚本中的更多奇特逻辑(在我们的例子中,模块自动为 BETA 脚本添加 BETA 库路径)。


要解决“MyIncPathMaintenance.pm 去哪里?”的问题,这取决于您的环境。您可以在此处找到有关如何构建 @INC 的详细讨论:How is Perl's @INC constructed? (aka What are all the ways of affecting where Perl modules are searched for?)

包括您的 Perl 解释器的默认 @INC 是什么以及如何通过环境变量影响它。

关于perl - 如何在 perl 脚本中包含 BEGIN 部​​分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17661091/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com