Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > while по %hash


Автор: burakov 15.4.2011, 13:22
Добрый день,

подскажите, хочется делать так

Код

while (my ($key, $value) = each (%hash)) {

      print $key . $value; 
      $hash {new_key} = new_value;

}


но нужно, чтобы хеш предоставлял $key и $value по мере добавления
такое может делать модуль use Tie::IxHash; но по хешу связанному с Tie::IxHash

while (my ($key, $value) = each (%hash)) - не получается

по справке посмотрел - там просто можно получить в массив $key или $value.
А хочется добавлять в хеш и одновременно идти по нему
Возможно ли такое?

Автор: ming 15.4.2011, 21:33
добавление в хэш сбрасывает его итератор, так что следующий вызов each даст не очередную пару, а самую первую.

Так что чтобы сделать подобный функционал, вам нужно 
1) отказаться от each 
2) завести дополнительный массив куда будете складывать копии ключей

Код

my %hash = ... ;
my @keys = keys %hash ;
my $i=0; # индекс очередного ключа

while(1) {
  if (<условие завершения работы>) { last }
  my $key = $keys[$i++] ;  # очередной ключ ("эмуляция" :-D работы each)

  if (not exists $hash{$key}) { last } # элемент не существует
  my $value = $hash{$key};
  ...
  <тут работа с $key и $value>
  ...
  # добавление в хэш новых данных, если есть
  if (<есть новые данные>) {
    $hash{<new key>} = <new value>;
    # + в массив ключей
    push @keys, <new key>;
  }
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)