为什么不在 Perl 中使用严格和警告?

2024-04-11

我见过一些混淆和打高尔夫球的代码,这些代码保持关闭状态以避免声明变量,并且我可以看到使用 -e 开关在命令行上跳过它们以保持单行更短。在哪些情况下您不希望这样做use strict and/or use warnings在生产代码中?您不想使用它们的原因是什么?

之所以出现这个问题,是因为我在这里看到过一些帖子,经验丰富的 Perl 用户告诉 Perl 新手:always使用它们。

我确实在这里找到了一些相关的问题,但它们没有解释我们可能想要关闭它们的情况。


The strictpragma 将您限制为 Perl 的一个合理的子集。一些旧功能具有历史意义(或者对单行代码有好处),但在现代、可读的代码库中没有位置。

The strictpragma 分为三类:

  • "vars"强制您声明所有变量。这可以防止拼写错误,并确保您选择一个范围(全局/词法)。在单行代码中,这并不需要那么多,因为通常作用域和变量都很少。一些单行习语不能只与词汇变量一起使用。

  • "refs"不允许使用 symref。它们对于词法变量没有任何意义,而 Perl5 有真正的引用。所以它们一般来说是没有用的。然而,符号引用对于元编程仍然很有价值:

    # generate accessors
    for my $field (qw/foo bar baz/) {
      no strict 'refs';
      *{ __PACKAGE__ . '::' . $field } = sub { shift()->{$field} };
    }
    
  • "subs"强制将大多数裸字解释为子例程调用。这解决了歧义foo . "bar" to be foo() . "bar"。如果该类别未被激活,并且如果没有foosub 当前已定义,那么它将被解析为"foo" . "bar"。这对于 shell 程序员来说是有意义的,因为所有裸字都是字符串。但在 Perl 程序中,这极大地增加了程序员的认知负担,并且是不值得的。

摘要:对于未优化可读性的简单脚本,strict "vars"并不是真的有必要。有几种情况no strict 'refs'是所期望的。

The warningspragma 允许对警告消息进行细粒度控制。这对于刚接触 Perl 的程序员来说尤其重要,他们经常编写诸如

my %hash = { foo => 1, bar => 2 };

想知道那在哪里HASH(0x1234567)钥匙来自。即使在一行中,警告也是可取的,除非您使用字符串化undef etc.

在专业的代码库中,没有理由不使用warnings 到处。如果脚本发出警告,则很可能存在错误,并且no warnings不会让这个错误消失。你对 Perl 的了解永远不会像对 Perl 的了解那么广博。warnings杂注。即使是大师也会犯错误。use warnings是一个很好的调试快捷方式。

也就是说,评论一下可能没问题use warnings部署程序时。但绝不是为了发展。

根据开发团队的共识,还应该使用其他编译指示:

  • no indirect不允许被厌恶的人new Foo方法调用。我见过潜入的 bug,这些 bug 可能在编译时用这个 pragma 捕获。
  • no autovivification防止在只读操作中出现引用,例如$hash{doesnt_exist}{foo}.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么不在 Perl 中使用严格和警告? 的相关文章

  • 是否可以使用perl读取pdf文件中的文本?

    我想在 perl 中解析 pdf 文件中的文本 而不将 pdf 转换为任何其他格式 是否可以 是的你可以 看看CAM PDF http search cpan org dist CAM PDF 包裹 您可以使用此模块来提取文本 my pdf
  • 如何在 Perl 中取消导入函数?

    我正在尝试删除导入的符号 以便它们不能用作对象中的方法 但是no似乎不起作用 也许我不明白不 或者还有其他方法 use 5 014 use warnings use Test More still has carp after no car
  • WWW::Mechanize::Firefox - 如何打开多个选项卡

    我想打开两个单独的选项卡并在 Firefox 中保持打开状态 我在用WWW Mechanize Firefox 请找到下面的代码 usr bin perl w use strict use WWW Mechanize Firefox my
  • 哪一个代表null? undef 或空字符串

    我想插入null在表的一列中 哪一个代表null undef或空字符串 应该使用哪一种 为什么 我知道关于defined我可以检查一下 但我更多的是从数据库的角度来看 代表哪一个null更合适吗 Update 我在用DBI module D
  • 使用 Perl 计算字符串中的连续字符数

    我有一个包含多个连续字符序列的字符串 例如 aaabbcccdddd 我想将其表示为 a3b2c3d4 到目前为止 我已经想出了这个 usr bin perl str aaabbcccdddd str s 1 1 g print str n
  • 多个与单个 Catalyst 应用程序

    我有多个作为 FCGI 运行的 Catalyst 应用程序 将它们整合为具有多个控制器的单个控制器是否有好处 Thanks Simone 内存 大概吧 我认为每台服务器至少要保留 15MB 左右 因此如果您在 3 台服务器上运行 3 个应用
  • 使用 Getopt::Long 解析参数的最简洁方法

    我使用 GetOpt 来解析命令行参数 我想添加一个新选项 multi 它应该得到一个如下所示的字符串 key1 abc key2 123 key3 xwz 我不知道用户想要提供多少个自定义密钥 但他可以提供 minimax5键 另外 我想
  • CPAN shell 内存不足。在 Unix 上如何给它更多的内存?

    我得到一个Out of memory 所有安装的消息 我以前从未使用过 cpan 并且不太确定它是如何工作的 我做了一个ulimit在 cpan 目录中 结果是无限的 这是我正在看的内容 usr bin perl MCPAN e shell
  • 将参数传递给调试器中的 perl 文件并在系统执行的文件中设置断点

    因此 我使用 perl d file pl 在 perl 调试器中运行一个文件 但 file pl 也应该接受参数 如何向 file pl 提供参数 还有一个问题 file pl 中有这一行 system file2 pl 如果 file2
  • Bash - 在 perl 正则表达式中使用变量以及匹配组

    这是我在 stackoverflow 上的第一篇文章 如果我错过了一些重要的内容 请原谅我 我目前遇到以下问题 目标是根据我准备的文件列表动态替换端口号find 这些文件中的所有端口均以数字 4 开头 有 5 位数字 现在是棘手的部分 我只
  • 如何将文本转换为标题大小写?

    我有一个文本文件 其中包含需要更改为标题大小写的标题列表 单词应以大写字母开头 但大多数冠词 连词和介词除外 例如 这个书名列表 barbarians at the gate hot flat and crowded A DAY LATE
  • Perl 导入到我的所有包中?

    我倾向于经常使用 Data Dumper 最终我的 pl 代码中每个包的顶部都有以下样板 use strict use warnings use Data Dumper Data Dumper Deparse 1 Data Dumper P
  • 如何在正则表达式中区分数字和ip地址?

    例如 如果我们查看 5 56 和 183 55 0 144 基本上 当你做这样的事情时 d d 它匹配 5 56 189 55 和 0 144 有没有办法通过正则表达式仅匹配数字而不匹配 ip 地址的部分 我尝试使用前瞻 但我不知道它应该是
  • 将相同匹配模式的连续 2 行放入单行中

    我想解析这组行 以便如果得到相同的模式 例如 lt email protected cdn cgi l email protection gt 在连续的行中 它应该以单行形式打印 并在两行之间使用 q2VDWKkY010407 222187
  • OpenSSL DH 密钥太小错误

    我正在尝试使用简单的 PERL 脚本连接到封闭的服务器 空调 usr bin perl use 5 10 1 use warnings use strict use IO Socket SSL use IO Socket SSL qw de
  • 在 FOR 循环中打印唯一值

    我有两个文件 myresult 和 annotation 两个文件中的数据似乎是范围 但事实并非如此 这就是为什么我无法将其存储在数组中 我需要使用拆分运算符 以便我可以在 for 循环中使用它并进行比较 现在我需要打印 i myresul
  • 正则表达式从字符串中提取 IP 和端口

    我正在使用 Perl 尝试从字符串中提取 IP 地址和端口 我尝试使用的正则表达式是 s sip 字符串是 sip 255 255 255 255 8080 transport TCP sip 255 255 255 255 8080 显然
  • Perl 的反引号、system 和 exec 有什么区别?

    有人可以帮帮我吗 在 Perl 中 以下之间有什么区别 exec command and system command and print command 还有其他方法可以运行 shell 命令吗 exec 执行命令并一去不复返 这就像一个
  • 如何使用 Perl CGI 脚本提供图像?

    我的 Google fu 让我失望了 如何使用 Perl 提供已生成的图像 Example img src getimage pl getimage pl 里有什么 干得好 usr bin perl w my file inner nav
  • Perl Parallel::Forkmanager 不允许收集变量值

    也许因为子进程不知道我的散列 请参阅下面的代码 散列 输出没有收集任何内容 除了写入 tmp 文件之外 还有其他方法来收集该值吗 foreach Item AllItems pid pm gt start Item and next Tem

随机推荐