我在查找程序问题时遇到了一些麻烦。得到错误:
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 = '';
它会打印,但中有很多空行。我怎样才能消除这些?
编辑:出于兴趣和效率的目的:使用拆分来获得我想要的更好吗?
提前感谢您的任何帮助或建议。如果您需要文件格式的示例,请告诉我。
答案 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;
}