perl - perl 函数定义因未初始化值而失败
问题描述
我的 perl 代码有点陈旧,所以我可能在这里遗漏了一些非常明显的东西,但我已经在一些旧代码 CGI 代码中添加了一个小模块来重构常用函数。这是模块的摘录,其中部分给我带来了问题:
package Common;
use strict;
use warnings;
use base 'Exporter';
our @EXPORT_OK = (&fail_with_error);
sub fail_with_error {
my ($errmsg, $textcolor) = @_;
my $output = printf("<p><font color=\"%s\">ERROR: %s </font>/<p>", $textcolor, $errmsg);
print($output);
exit(1);
}
当我直接使用(或者当我只是在测试代码中导入函数,甚至没有调用它)执行这个模块perl Common.pm
时,我得到的是一个未初始化的值错误$errmsg
,$textcolor
如下所示:
$ perl Common.pm
Use of uninitialized value $textcolor in printf at Common2.pm line 10.
Use of uninitialized value $errmsg in printf at Common2.pm line 10.
<p><font color="">ERROR: </font>/<p>1
似乎 perl 发出警告是因为它按字面意思执行子例程代码,但子例程的本质是它是抽象的,因此可以正确传递不同的值?这是有理由的,这些不应该被填充来传递解释器警告,但仍然有问题。
我四处搜索,但这个错误很常见,因为在大多数情况下,变量确实是未初始化的。我似乎找不到任何适用于这种情况的东西。
解决方案
那是因为你不小心用调用 fail_with_error: 来填充 @EXPORT_OK &fail_with_error
,而不是函数名。此调用fail_with_errors
使用从当前填充的参数@_
(恰好为空)进行调用 - 所以自然这两个变量都未初始化(并且您的函数也不会被导出)。正确的分配只使用子例程名称:
our @EXPORT_OK = qw( fail_with_error );
推荐阅读
- python - 将字符串中的数学方程式转换为 int
- java - 不和谐 jda 机器人 || UserUpdateActivityEvent 不会触发
- documentation - VSC 文档是如何制作的?
- swift - 如何在 SwiftUI 中重用视图并填充不同的数据?
- python - 为什么我在 Python 中得到错误的回溯?
- c++ - linux sockets cpp recv() - 无法通过http接收完全数据
- node.js - docker-compose up --build 找不到模块
- reactjs - 为什么在为显示属性等类属性调用 setState 时会出错?
- flutter - 小部件可以有一个“联合”状态吗?
- reactjs - 在单击跨度时,我们如何使用 useRef() 获取正确的跨度名称