我什么时候应该使用 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? 的相关文章

  • 检查程序是否正在运行,如果不在 perl 中则运行它

    我想知道如何检查程序是否正在运行 如果没有则运行该程序 使用 Kill 函数向要检查的进程 ID 发送 0 零 信号 如果进程存在 函数返回true 否则返回false Example check if process 1525 is ru
  • 我们应该聘请用 Perl 编写 C 的人吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我的一位同事最近面试了一些求职者 其中一位说他们有非常好的 Perl 经验 由于我的同事不懂 Perl 他要求我对那位潜在雇员编写的 场外 一些代码进
  • 如何在 Perl 中运行匿名函数?

    sub print 1 sub print 1 我尝试了各种方法 都是错误的 sub 将为您提供指向该函数的指针 因此您必须通过引用调用 sub print Hello world n gt 另一种简单的方法 如所指出的布拉戈维斯特 布尤克
  • 在 Perl 中查找标量变量的数据类型

    我有一个接受用户输入的函数 输入可以是整数 浮点数或字符串 我有三个重载函数 应该根据输入数据的数据类型调用它们 例如 如果用户输入一个整数 比如100 则应该调用具有整数参数的函数 如果用户输入字符串 例如 100 则应调用具有字符串参数
  • Emacs cperl - 常量块中的缩进

    我正在运行基于 GNU Emacs 24 3 50 2 的 Aquamacs 3 0a cperl 版本是 6 2 当我编辑 Perl 常量块时 我得到了我不想要的额外缩进 use constant ONE gt 1 TWO gt 2 TH
  • Mason 方法范围 - 覆盖

    Using Mason2 https metacpan org pod Mason 有 3 个组件 Base mc tmp Base mc tmp index mc The tmp index mc内容 hello from the Som
  • 在 Objective-C 中使用 perl?

    CPAN 有大量非常有用的库 除了将它们移植到 Objective C 之外 是否还有在 iOS 上将 Perl 代码嵌入到 Objective C 中的方法 我对使用特别感兴趣电子表格 阅读 http kobesearch cpan or
  • 从 shell 脚本调用 Perl,如何将返回值从 Perl 传递到 shell?

    我成功地从 shell 脚本调用 Perl 脚本 现在我想将 Perl 脚本的返回值传递给 shell 脚本 指示它是否成功 我该怎么做呢 只需使用适当的退出值退出 Perl 脚本即可 exit exit value exit 0 if p
  • 如何从 Perl 中的 Subversion 预提交挂钩访问提交的文件?

    我需要执行以下操作 用 Perl 编写预提交钩子 Hook 应检查所有提交的文件是否存在某些文本 如果未找到该文本则失败 基本上 我需要一个读取正在提交的文件的 Perl 钩子示例 我真的在寻找一些代码量最少的优雅解决方案 笔记 钩子应该使
  • 多维哈希排序 - Perl [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我真的需要一些帮助来理解这个哈希并对
  • 为什么Perl的SUPER调用不使用箭头方法?

    我注意到 当您调用超类的方法时 您需要执行以下操作 my self class gt SUPER new 为什么不是这样 my self class gt SUPER gt new 我怀疑是因为 class gt SUPER gt new
  • Perl 脚本(或任何东西)来合计 CSV 列

    我写了 在其他人的很多帮助下 awk command https stackoverflow com questions 4159224 excel and awk disagree about csv totals 4159404 415
  • typedef 基本数据类型什么时候有意义?

    一家公司的内部 C 编码标准文档指出 即使对于 int char 等基本数据类型 也应该定义自己的 typedef 例如 typedef int Int 代码的可移植性证明了这一点是合理的 然而 是否有关于何时 针对哪种类型的项目 真正有意
  • 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
  • 使用 Perl 循环 JSON [重复]

    这个问题在这里已经有答案了 我是 Perl 的新手 想要循环这个 JSON 数据并将其打印到屏幕上 我怎样才能做到这一点 arr Year 2012 Quarter Q3 DataType Other 3 Environment STEVE
  • 为什么我不应该使用 UNIVERSAL::isa?

    根据这个 http perldoc perl org UNIVERSAL html http perldoc perl org UNIVERSAL html 我不应该使用 UNIVERSAL isa 而应该使用 obj gt isa 或 C
  • 忽略 C 中的返回值

    最近 我开始使用 lint 进行静态代码分析 我有时收到的警告之一就是关于这个问题 比方说 我有以下功能 uint32 t foo void 假设我故意忽略函数的返回值 为了使警告消失 可以写 void foo 我的问题是 编写这样的代码的
  • 使用perl,在每行都有相同单词的情况下如何选择最后两行?

    Bini 21 89753 20 47853 20 27835 18 34952 16 23454 Bini 16 89753 14 47853 13 27835 12 34952 11 23454 Bini 10 09014 我的文件有一
  • 如何从 R 运行带有特定模块的 perl 脚本?

    我可以从终端运行 perl 脚本 myperlscript pl 没有任何问题 但是 如果我尝试从 RStudio 中运行相同的 perl 脚本 则会出现以下错误 command lt myperlscript pl outputfile
  • 如何在 Perl 中使用 use strict 一次一行处理多行字符串?

    我正在尝试找出 PBP 批准的正确方法来一次一行处理多行字符串 许多 Perl 编码人员建议将多行字符串视为文件句柄 除非您在脚本中使用 use strict 否则它可以正常工作 然后 您会收到编译器发出的警告 提示在使用严格引用时无法使用

随机推荐

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