| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: Общие вопросы > Перебор хеша в цикле и недостающие элементы |
| Автор: Suppir 20.4.2011, 16:00 |
| Делаю перебор в хеше: foreach $x(keys %gar){ print OUT "$gar{$x}{topic}$gar{$x}{pub}\n" } значение $gar{$x}{topic} есть всегда а значения $gar{$x}{pub} есть в 90% случаев. Perl выдает: Use of uninitialized value in concatenation (.) or string at !comparator8.pl line 1496, <KON> line 2644738. Как сделать перебор правильно, чтобы не выскакивало предупреждений? Кроме $gar{$x}{pub} в хеше еще 10 параметров, которые могут быть, а могут и не быть. Нужно выводить их в том случае, если они есть. |
| Автор: ginnie 20.4.2011, 16:05 | ||
Я бы написал так:
|
| Автор: Jimy 20.4.2011, 16:06 | ||||
|
| Автор: arto 20.4.2011, 16:07 |
| perldoc -f exists |
| Автор: IceSunrise 20.4.2011, 16:09 | ||
Suppir, паребираете элементы вы правильно, предупреждение возникает при выводе не существующего элемента хеша. Добавьте дополнительную проверку.
|
| Автор: Suppir 20.4.2011, 16:30 |
| Ребята, я использовал ранее предложенные вами варианты. Но мне нужно выводить, например, в log: print log "$gar{$x}{topic}$gar{$x}{pub}$gar{$x}{prim}$gar{$x}{raw}\n\n" (и т.д., всего 10 параметров). Делать проверку всех параметров нереально - слишком много комбинаций. Нужно сделать огромное количество проверок перед выводом. Всегда есть параметр $gar{$x}{topic}, а остальные могут быть, а могут и не быть. Нужно вывести в лог только те параметры, которые есть. Но при этом чтобы не возникало предупреждений. Интересует, как можно добавить в хеш "пустые" элементы? Чтобы и в лог ничего лишнего не выводилось, и предупреждений не возникало. |
| Автор: Pfailed 20.4.2011, 16:36 |
| Сделать no warnings или вовсе не делать use warnings уже предлагали? |
| Автор: Suppir 20.4.2011, 16:39 |
| Pfailed, предупреждения я использую для отлова других ошибок. Очень полезно. Интересует, можно ли добавить в хеш "пустые" элементы (которые НЕ будут выводиться в log и не будут вызывать предупреждения). |
| Автор: ginnie 20.4.2011, 16:46 | ||
| Suppir, чем мой вариант не устраивает? Добавить элементы несложно:
|
| Автор: Pfailed 20.4.2011, 16:48 | ||||
|
| Автор: Suppir 20.4.2011, 16:53 |
| Спасибо, попробую эти варианты: $gar{$x}{$_} //= '' for (qw(topic pub prim raw)) # не выводить предупреждения об uninitialized только в этом блоке no warnings 'uninitialized'; print log "$gar{$x}{topic}$gar{$x}{pub}$gar{$x}{prim}$gar{$x}{raw}\n\n"; } |
| Автор: Jimy 20.4.2011, 20:30 | ||
|