当有正则表达式匹配时,未初始化的eq警告

时间:2012-08-02 15:23:00

标签: regex perl mod-perl

我的代码中出现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

修改

parameters subhash包含通过url输入(post和/或get)给出的所有变量。 type值是可能在网址中的变量之一。 如果type值是否在网址中,则无关紧要,如果它包含值,我总是会收到uninitialized value in string eq警告。即使我通过在有缺陷的线之前警告它来控制线的类型值。

2。编辑: 正如@ikegami认为确实存在导致警告的elsif

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

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

并且$somevalue是未初始化的。

1 个答案:

答案 0 :(得分:6)

你只在该行上显示了一半的陈述。完整的陈述实际上看起来像

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

语句的运行时警告通常使用语句启动时的行号,因此如果正则表达式不匹配且未定义$baz,则会为{{}获取警告列表行456第459行{1}}。

这是同样的想法:

eq

最近*,Perl已更改,因此$ 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。

  • - 实际上,不是最近。 5.10和5.12都已经过终结,但你似乎正在使用更旧版本。如果您要询问有关Perl的过时版本的问题,请提及它。

elsif