Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перебор хеша в цикле и недостающие элементы 
:(
    Опции темы
Suppir
Дата 20.4.2011, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



Делаю перебор в хеше:

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 параметров, которые могут быть, а могут и не быть. Нужно выводить их в том случае, если они есть. 
PM MAIL   Вверх
ginnie
Дата 20.4.2011, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Я бы написал так:
Код

foreach $x(keys %gar){
    print OUT $gar{$x}{$_} if (exists $gar{$x}{$_}) for (qw(topic pub));
    print OUT "\n";
}


Это сообщение отредактировал(а) ginnie - 20.4.2011, 16:10


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Jimy
Дата 20.4.2011, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 4.7.2010

Репутация: нет
Всего: 3



Код

no warnings;
foreach $x(keys %gar){
    print OUT "$gar{$x}{topic}$gar{$x}{pub}\n"
}


Код

foreach $x(keys %gar){
    print OUT $gar{$x}{topic}.(defined $gar{$x}{pub} && $gar{$x}{pub})."\n";
}

PM   Вверх
arto
Дата 20.4.2011, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



perldoc -f exists
PM MAIL ICQ   Вверх
IceSunrise
Дата 20.4.2011, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 7.4.2008
Где: Санкт-Петербург

Репутация: 3
Всего: 3



Suppir, паребираете элементы вы правильно, предупреждение возникает при выводе не существующего элемента хеша. Добавьте дополнительную проверку.
Код

foreach $x(keys %gar){
  if (exists $gar{$x}{pub})
  {
     print OUT "$gar{$x}{topic}$gar{$x}{pub}\n"
  }
  else
  {
    print OUT "$gar{$x}{topic} - \n"
  }
}

PM MAIL   Вверх
Suppir
Дата 20.4.2011, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



Ребята, я использовал ранее предложенные вами варианты. Но мне нужно выводить, например, в log:

print log "$gar{$x}{topic}$gar{$x}{pub}$gar{$x}{prim}$gar{$x}{raw}\n\n"   (и т.д., всего 10 параметров).

Делать проверку всех параметров нереально - слишком много комбинаций. Нужно сделать огромное количество проверок перед выводом. 

Всегда есть параметр $gar{$x}{topic}, а остальные могут быть, а могут и не быть. Нужно вывести в лог только те параметры, которые есть. Но при этом чтобы не возникало предупреждений.

Интересует, как можно добавить в хеш "пустые" элементы? Чтобы и в лог ничего лишнего не выводилось, и предупреждений не возникало. 

Это сообщение отредактировал(а) Suppir - 20.4.2011, 16:31
PM MAIL   Вверх
Pfailed
Дата 20.4.2011, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 22
Всего: 39



Сделать no warnings или вовсе не делать use warnings уже предлагали?


--------------------
PM MAIL   Вверх
Suppir
Дата 20.4.2011, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



Pfailed

предупреждения я использую для отлова других ошибок. Очень полезно. 

Интересует, можно ли добавить в хеш "пустые" элементы (которые НЕ будут выводиться в log и не будут вызывать предупреждения).

Это сообщение отредактировал(а) Suppir - 20.4.2011, 16:41
PM MAIL   Вверх
ginnie
Дата 20.4.2011, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Suppir, чем мой вариант не устраивает?

Добавить элементы несложно:

Код

$gar{$x}{$_} //= '' for (qw(topic pub prim raw));



--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Pfailed
Дата 20.4.2011, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 22
Всего: 39



Цитата(Suppir @ 20.4.2011,  16:39)
Pfailed

предупреждения я использую для отлова других ошибок. Очень полезно. 

Интересует, можно ли добавить в хеш "пустые" элементы (которые НЕ будут выводиться в log и не будут вызывать предупреждения).

Код

use strict;
use warnings;

...

{
    # не выводить предупреждения об uninitialized только в этом блоке
    no warnings 'uninitialized';
    print log "$gar{$x}{topic}$gar{$x}{pub}$gar{$x}{prim}$gar{$x}{raw}\n\n";
}





--------------------
PM MAIL   Вверх
Suppir
Дата 20.4.2011, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



Спасибо, попробую эти варианты:


$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";
}

PM MAIL   Вверх
Jimy
Дата 20.4.2011, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 4.7.2010

Репутация: нет
Всего: 3



Код

join('', values %{$gar{$x}})

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0915 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.