Perl:未初始化的调试///?

时间:2011-06-10 03:01:35

标签: perl debugging

我在查找程序问题时遇到了一些麻烦。得到错误:

Use of uninitialized value in substitution (s///)

我之前已经意识到这一点,但这对我没有帮助。我意识到$1可能是幺正的,但我想知道你们是否可以帮助我找出原因?

以下是代码的问题部分:

$one_match_ref->{'sentence'} = $1 if ($line =~ /^Parsing \[sent. \d+ len. \d+\]: \[(.+)\]/);
$one_match_ref->{'sentence'} =~ s/, / /g;

编辑:我已经宣布$one_match_ref->{'sentence'}如此:

my $sentence;
$one_match_ref = {
        chapternumber => $chapternumber_value,
        sentencenumber => $sentencenumber_value,
        sentence => $sentence, ##Get from parsed text: remove commas
        grammar_relation => $grammar_relation_value, ##Get from parsed text: split?
        arg1 => $argument1, ##Get from parsed text: first_dependencyword
        arg2 => $argument2 ##Get from parsed text: second_dependencyword
    };

但这些变量都没有分配给它们。

我的尝试:

A。如果我在s ///之后放置if( defined (one_match_ref->{'sentence'})),它就可以了。但这很麻烦,似乎是在避免问题而不是解决问题。

我最后一次使用该修复程序时,是因为我的循环有一个“off-by-one”错误,我不认为这次是这种情况。

B。如果我声明:my $sentence = '';它会打印,但中有很多空行。我怎样才能消除这些?

编辑:出于兴趣和效率的目的:使用拆分来获得我想要的更好吗?

提前感谢您的任何帮助或建议。如果您需要文件格式的示例,请告诉我。

2 个答案:

答案 0 :(得分:3)

我不确定$1这是未初始化的,而是$one_match_ref->{'sentence'}

当且仅当行与正则表达式匹配时,才设置该值。否则它根本没有触及。

我的理由是它在替换而不是分配期间抱怨。您可以可能修复它,只需将$one_match_ref->{'sentence'}设置为这两行之前的已知值(例如空字符串)。

但这取决于你实际使用这些值的是什么。

答案 1 :(得分:3)

您的代码归结为

my $sentence;
$one_match_ref = { sentence => $sentence };
() if ($line =~ /^Parsing \[sent. \d+ len. \d+\]: \[(.+)\]/);
$one_match_ref->{'sentence'} =~ s/, / /g;

您将undef分配给$one_match_ref->{'sentence'},然后尝试从中删除逗号。这没有任何意义,因此警告。

也许你想要

my $sentence;
$one_match_ref = { sentence => $sentence };
if ($line =~ /^Parsing \[sent. \d+ len. \d+\]: \[(.+)\]/) {
   $one_match_ref->{'sentence'} = $1;
   $one_match_ref->{'sentence'} =~ s/, / /g;
}