我什么时候应该使用 Perl 的 AUTOLOAD?

2023-11-25

In "Perl 最佳实践“ AUTOLOAD 部分的第一行是:

不要使用自动加载

然而,他描述的所有案例都涉及面向对象或模块。

我有一个独立的脚本,其中一些命令行开关控制定义特定函数的哪些版本。现在我知道我可以将条件和评估放在文件顶部,然后再进行其他操作,但我发现将它们放在文件末尾的 AUTOLOAD 中既方便又干净。

这是不好的做法/风格吗?如果您这么认为,为什么,还有其他方法吗?

根据布莱恩的要求

我基本上使用它来基于命令行开关进行条件编译。

我不介意一些建设性的批评。

sub AUTOLOAD {
    our $AUTOLOAD;

    (my $method = $AUTOLOAD) =~ s/.*:://s; # remove package name
    if ($method eq 'tcpdump' && $tcpdump) {
        eval q(
        sub tcpdump {
            my $msg = shift;
            warn gf_time()." Thread ".threads->tid().": $msg\n";
        }
        );
    } elsif ($method eq 'loginfo' && $debug) {
        eval q(
        sub loginfo {
            my $msg = shift;
            $msg =~ s/$CRLF/\n/g;
            print gf_time()." Thread ".threads->tid().": $msg\n";
        }
        );
    } elsif ($method eq 'build_get') {
        if ($pipelining) {
            eval q(
            sub build_get {
                my $url = shift;
                my $base = shift;
                $url = "http://".$url unless $url =~ /^http/;
                return "GET $url HTTP/1.1${CRLF}Host: $base$CRLF$CRLF";
            }    
            );
        } else {
            eval q( 
            sub build_get {
                my $url = shift;
                my $base = shift;
                $url = "http://".$url unless $url =~ /^http/;
                return "GET $url HTTP/1.1${CRLF}Host: $base${CRLF}Connection: close$CRLF$CRLF";
            }    
            );
        }    
    } elsif ($method eq 'grow') {
        eval q{ require Convert::Scalar qw(grow); };
        if ($@) {
            eval q( sub grow {} );
        }
        goto &$method;
    } else {
        eval "sub $method {}";
        return;
    }
    die $@ if $@;
    goto &$method;
}

另一种策略是将脚本编写为 App::* 模块,并让命令行选项选择要加载的类以提供可根据选项插入的任何功能。你会require一旦你知道是哪一门课,就可以及时上学。这是更多的前期工作,但如果您打算长期维护脚本,我敢打赌它会得到回报。在过去的几年里,出现了一些非常好的工具,用于创建其功能真正存在于模块中的脚本,包括App::Cmd, MooseX::Getopt, and 两者的私生子.

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

我什么时候应该使用 Perl 的 AUTOLOAD? 的相关文章

随机推荐

  • Python中的数字比较用“is”好还是“==”好? [复制]

    这个问题在这里已经有答案了 在Python中比较两个数字是使用 is 运算符还是 运算符更好 例子 gt gt gt a 1 gt gt gt a is 1 True gt gt gt a 1 True gt gt gt a is 0 Fa
  • 发送邮件:java.net.SocketException:网络无法访问:连接

    尝试通过 javax mail 发送邮件 Properties props new Properties props put mail smtp host xxxxx props put mail smtp port 25 props pu
  • Laravel 4 - 尝试获取非对象的属性

    我一直在使用 Laravel 4 1 创建一个具有用户关系的图书列表应用程序 我的用户关系正常工作 但是当我添加分页时 出现以下错误异常 ErrorException Trying to get property of non object
  • 您应该在 C# 4.0 中使用重载或可选参数来声明方法吗?

    我当时正在看Anders 谈论 C 4 0 和抢先预览 C 5 0 这让我思考当 C 中提供可选参数时 推荐的方法是什么来声明不需要指定所有参数的方法 例如类似的东西FileStream类有大约十五个不同的构造函数 它们可以分为逻辑 家族
  • 为什么字段分隔符只能是一个字节?

    data lt read delim C test txt header FALSE sep Error in scan file what sep sep quote quote nlines 1 quiet TRUE invalid s
  • 将 Objective-c 框架导入到 Swift 框架项目中

    我正在构建一个框架 需要在其中导入一些 Objective C 框架 现在我需要导入 Beaconstac framework 但我们无法在 swift 框架项目中添加桥接头 我如何在我的项目中使用这个框架 I tried 进口信标 但编译
  • Auth0 和 React 的 CORS 问题

    我目前正在尝试在我的 NodeJS React 应用程序中实现 Auth0 尽管我有一个大问题 但给出的教程确实很好并且很有帮助 每次我尝试通过 Auth0 登录 注册时 我都会得到 XMLHttpRequest 无法加载https XYZ
  • 将数据从活动传递到对话框

    我正在寻找一种将数据从活动传递到对话框的方法 我正在尝试打电话showDialog int 但是我没有看到将任何数据传递到对话框的方法 我需要将一个字符串传递到对话框才能显示确认 Cheers 如果您的目标是 Android 2 2 API
  • 如何使窗口出现在所有内容之上(甚至是全屏游戏!)c++/Qt

    我正在尝试制作一个在屏幕中心显示十字准线并保持在其他所有内容之上的应用程序 目的是在一些不提供十字准线的 FPS 游戏中添加十字准线 我已经成功地将我的窗口设置为除了游戏之外的所有内容的最上面 这是我的代码 一切都在主要部分 因为我只测试我
  • 当前 Android Google Spreadsheet API 编写示例

    我正在寻找一个编写 Google 电子表格并从 Android 向其中添加行的示例 到目前为止 我发现的所有示例都已过时 仅包含身份验证 或仅列出文档 电子表格 不包含任何写入 您知道创建电子表格并向其中添加行的任何示例吗 以下是适用于 G
  • Java TreeMap 比较器

    我需要一个 TreeMap 的比较器 我应该在 TreeMap 的构造函数中匿名编写此代码吗 我还能怎么写我的比较器 目前 Java 不喜欢我的代码 我可以匿名执行此操作吗 SortedMap
  • 如何为另一个数据库执行存储过程?

    我有一个存储过程 应该能够在我的 MS Sql Server 上的任何数据库的任何表上执行 大多数 EXEC 和 USE 语句的组合不会产生任何结果 这是存储过程 CREATE PROCEDURE dbo usp TrimAndLowerC
  • R 成对乘积

    我正在尝试获取向量的成对乘积 例如 a c 1 2 3 4 我想要得到的是 2 3 4 6 8 12 按顺序 我尝试过使用外部 outer 1 4 2 4 这给了我一个矩阵 其中包含我想要的产品 但我不确定如何以缩放到更高维度向量的方式从矩
  • 在具有大型 C 文件的 vim 中启用语法和语法折叠会导致完成速度变慢

    当我在一个大的 C 文件 大约 8000 行中有语法时 完成ctrl p和ctrl n非常慢 超过20 当我关闭语法时 完成时间不到一秒钟 我找到了重现这种行为的最小方法 使用空的 vim 文件夹并创建仅包含以下行的 vimrc set s
  • 如何让CSV阅读器读取内存文件?

    我正在尝试将整个文件提取到内存中 完成 使用 StringIO 但据我所知 这些对象的行为并不完全像 真实 文件 我得到了整个内容 或者我可以读取一次一行 但我不知道如何应用此模式 import csv with open MYMEMORY
  • 如何使用 simple_form 生成 input[type=date]?

    当我做f input start date as date我得到 3 个选择元素 日 月和年 我可以f input start date as string to get input type text 元素 但我怎样才能生成input t
  • 订阅或绑定现有的Intent服务

    我有一个应用程序 它的初始活动会在列表视图中列出一些文件 单击列表中的某个项目时 您将看到该特定文件的详细活动 在详细视图中 我有一个名为下载的按钮 当您单击下载时 它会启动一个 IntentService 该 IntentService
  • 第一次使用 MongoDB + Docker - 从 docker compose 设置

    我想尝试一下project我在 GitHub 上找到了 所以我在 MacOS 上安装了 MongoDB 现在我试图了解如何通过目录中的 docker compose 文件正确设置它 这是泊坞窗文件 version 3 services re
  • 代码完成不适用于远程文件(使用 RSE)

    What is 在主机上 Windows 7的 面向 PHP 开发人员的 Eclipse版本 Helios 服务版本 2 在访客机器上 Linux Debian 挤压 我想使用 RSE 在 Eclipse 中通过 SSH 编辑我的远程项目
  • 我什么时候应该使用 Perl 的 AUTOLOAD?

    In Perl 最佳实践 AUTOLOAD 部分的第一行是 不要使用自动加载 然而 他描述的所有案例都涉及面向对象或模块 我有一个独立的脚本 其中一些命令行开关控制定义特定函数的哪些版本 现在我知道我可以将条件和评估放在文件顶部 然后再进行