Perl - использование строк вместо хеш-ключей - PullRequest
0 голосов
/ 05 января 2019

в динамическом цикле я хочу генерировать строки и затем назначать их в качестве ключей хеша, а затем привязывать некоторые значения к каждому из них. что я сделал, это (без использования строгого)

$number = 1; %clause = ();

for(condition)
  {
     if (condition)
     { 
       $name = join '', 'hash', $number; 
       $clause{$$name} =  [ @somearray ];
       $number++;
    }
 }

То, что я ожидал, - это иметь хеш предложения с ключами hash1, hash2 ... и т. Д. Теперь он действительно работает, но только один раз, только для последнего значения. Например, я пишу этот код, он выводит только самый последний массив, назначенный самому последнему хеш-ключу. Кажется, $ name перезаписано

foreach $key (keys %clause)

{ print "@{$clause{$key}}"; }

Можете ли вы показать мне, как я могу это сделать, спасибо

Ответы [ 2 ]

0 голосов
/ 05 января 2019

ВСЕГДА используйте use strict;. Это бы нашло вашу проблему. (Global symbol "$hash1" requires explicit package name)

ВСЕГДА используйте use warnings qw( all );. Это бы нашло вашу проблему. (Use of uninitialized value in hash element)


Ваш код использует значение переменной $hash1 в качестве ключа. Поскольку вы никогда ничего не назначали для $hash1, это значение равно undef, которое преобразуется в пустую строку. Это означает, что

 $name = join '', 'hash', $number; 
 $number++;
 $clauses{$$name} =  [ @somearray ];

эквивалентно

 $number++;
 $clauses{""} =  [ @somearray ];

Просто замените $$name (значение переменной с именем $name) на $name (значение $name).

 $name = join '', 'hash', $number; 
 $number++;
 $clauses{$name} =  [ @somearray ];

Очищено:

 my $name = 'hash' . $number++;
 $clauses{$name} =  [ @somearray ];

Но почему вы не используете массив?

 push @clauses, [ @somearray ];
0 голосов
/ 05 января 2019

Я бы посоветовал вам немного переписать этот цикл и создать ключ с интерполяцией строк. Вам не нужно $name для чего-либо вне цикла.

use strict;
my $number = 1;
for my $item (@items)
{
  if ( i_care_about($item) )
  { 
   $clause{"hash$number"} =  [ @somearray ];
   $number++;
  }
}

Поскольку вам нужна строка для ключа, просто создайте строку.

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