3

我在我的代码中收到uninitialized value in string eq at *** line xxx警告,如果该行确实有一个警告,这也很容易修复eq

但是 hashref 中的值存在正则表达式匹配。

if ($hashref->{parameters}->{type} =~ m/:/) {

在此之前的一些行我什至有这个:

$hashref->{parameters} = defined($hashref->{parameters}) ? $hashref->{parameters} : '';
$hashref->{parameters}->{type} = defined($hashref->{parameters}->{type}) ? $hashref->{parameters}->{type} : '';

所以这个值至少应该被初始化。

我问自己和你:为什么我仍然会收到值未初始化的警告,而且为什么它说eq而不是pattern match

编辑:

parameterssubhash 包含通过 url 输入(post 和/或 get)给出的所有变量。该type值是可能在 url 中的变量之一。type该值是否在 url 中都没有关系,如果它包含一个值,我总是会收到uninitialized value in string eq警告。即使我通过在错误行之前警告它来控制类型行的值。

2. 编辑: 正如@ikegami 所假设的,确实有一个elsif导致警告的

整个 if - elsif 语句看起来像:

if ($hashref->{parameters}->{type} =~ m/:/) {
    …
elsif ($hashref->{parameters}->{type} eq $somevalue) {
    …
}

$somevalue就是未初始化的。

4

1 回答 1

6

您只显示了该行语句的一半。完整的声明实际上看起来像

456: if ($foo =~ /bar/) {
457:    ...
458: }
459: elsif ($baz eq 'qux') {
460:    ...
461: }

语句的运行时警告通常使用语句开始处的行号,因此如果正则表达式不匹配且未$baz定义,您将eq在第 459 行收到警告列表第 456 行。

这里的想法是一样的:

$ perl -wE' my $x;  # 1
            say     # 2
            4       # 3
            +       # 4
            $x      # 5
            +       # 6
            5;      # 7 '
Use of uninitialized value $x in addition (+) at -e line 2.
9

最近*,Perl 进行了更改,以便将elsif条件视为不同的语句以避免此类问题。您必须拥有旧版本的 Perl。

  • ——实际上,不是最近。5.10 和 5.12 都已停产,但您似乎使用的是更旧的版本。如果您要询问有关 Perl 过时版本的问题,请提及。

$ perlbrew use 5.10.1

$ perl -we'
my ($x,$y,$z);
if ($x) {
} elsif ($y eq $z) {
}'
Use of uninitialized value $y in string eq at -e line 4.
Use of uninitialized value $z in string eq at -e line 4.

$ perlbrew use 5.8.9

$ perl -we'
my ($x,$y,$z);
if ($x) {
} elsif ($y eq $z) {
}'
Use of uninitialized value in string eq at -e line 3.
Use of uninitialized value in string eq at -e line 3.
于 2012-08-02T16:12:29.990 回答