Передача хеш-ссылки на несколько функций в Perl

У меня есть следующий код в Perl, где ссылка на хэш передается из основной функции в func1, а затем в func2. В func2 хэш обновлен. Я хочу получить доступ к обновленному хешу в основной функции. Также есть функция while в основной функции, и я ожидаю, что хэш должен обновляться во время каждой итерации. Код может не выглядеть логичным, но я только что написал скелет кода. Я всегда получаю пустой хеш, когда пытаюсь распечатать хеш в основной функции

sub main {
      my %hash1;
      while (some condition)
      {
        my $i=0;
        if($i==0)
        { 
          func1($i,\%hash1);                      
          $i=1;
        }
        else
        {  
          func1($i,\%hash1);                      
          $i=0;
        }
      }
      foreach my $a (keys %hash1)
      {
        print "$hash1{$a}";
      }       
}
sub func1
{    
my ($i,$hash1)=@_;
----
if($i==0)
{ 
   func2($hash1);       
}

}

sub func2
{
my ($hash2)=@_;
$hash2->{key1}=1;
$hash2->{key2}=2;
}

1 ответ

Ах я вижу. Вы думаете, что это ничего не печатает из-за того, что хеш пуст. Но на самом деле он ничего не печатает, потому что вы ничего не даете ему запустить. Вы даете это для компиляции, но не для запуска.

sub main ничего не значит в Perl. Для того, чтобы запустить это, вы должны поместить где-то на вашей основной линии main(); Затем при условии, что вы закомментируете --- в строке 25 вы получите ожидаемый результат.

Вот почему распечатка материала самостоятельно либо 1) немного больше печатает, либо 2) ненадежна. Вы ничего не видели и думали, что наш хэш был пуст. На самом деле, код даже не попал в объявление. Итак, вот подсказка в командной строке:

 cpan Smart::Comments

А потом, в вашем коде:

use Smart::Comments;
...

### %hash1

Таким образом, пустой хеш выглядит так:

### %hash1: {}

И тот, который вы ожидаете, выглядит так:

### %hash1: {
###           key1 => 1,
###           key2 => 2
###         }

Без вызова main sub, ваш вывод выглядит так:

(да, это пусто)

В противном случае, нет ничего плохого в том, что вы передали хэш.

Другие вопросы по тегам