首页 > 解决方案 > 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 发出警告是因为它按字面意思执行子例程代码,但子例程的本质是它是抽象的,因此可以正确传递不同的值?这是有理由的,这些不应该被填充来传递解释器警告,但仍然有问题。

我四处搜索,但这个错误很常见,因为在大多数情况下,变量确实是未初始化的。我似乎找不到任何适用于这种情况的东西。

标签: perl

解决方案


那是因为你不小心用调用 fail_with_error: 来填充 @EXPORT_OK &fail_with_error,而不是函数名。此调用fail_with_errors使用从当前填充的参数@_(恰好为空)进行调用 - 所以自然这两个变量都未初始化(并且您的函数也不会被导出)。正确的分配只使用子例程名称:

our @EXPORT_OK = qw( fail_with_error );

推荐阅读