Perl: отладка для неинициализированных s ///? - PullRequest
1 голос
/ 10 июня 2011

У меня проблемы с поиском проблемы с моей программой.Получение ошибки:

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. Если я поставлю: if( defined (one_match_ref->{'sentence'})) после s ///, это работает.Но это громоздко, и, кажется, избегает проблемы, а не решает ее.

В последний раз, когда я использовал это исправление, это произошло из-за того, что в моем цикле произошла ошибка «off-by-one», на этот раз я не думаю, что это так.

B. Если я заявляю: my $sentence = ''; Он печатает, но с большим количеством пустых строк между ними.Как я могу устранить их?

РЕДАКТИРОВАТЬ: В интересах и эффективности: лучше ли использовать сплит, чтобы получить то, что я хочу?

Заранее спасибо за любую помощь или совет.Дайте мне знать, если вам нужен пример формата файла.

Ответы [ 2 ]

3 голосов
/ 10 июня 2011

Ваш код сводится к

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;
}
3 голосов
/ 10 июня 2011

Я не уверен, что это $1, которое здесь неинициализировано, а скорее $one_match_ref->{'sentence'}.

Это значение устанавливается тогда и только тогда, когда строка соответствует регулярному выражению.В противном случае это вообще не трогается.

Я рассуждаю так, что он жалуется во время замены , а не задания.Вы можете возможно исправить это, просто установив $one_match_ref->{'sentence'} на известное значение перед этими двумя строками (например, на пустую строку).

Но это зависит от того, что вы на самом деле используете этизначения для.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...