Ответ 1
Всякий раз, когда вы обнаруживаете, что постфинирование имен переменных целым индексом, поймите, что вместо этого вы должны были использовать массив:
my @msgs = ('msg1', 'msg2', ..., 'msg6');
my @vals = ( [ @val1 ], [ @val2 ], ..., [ @val6 ] );
См. также FAQ Как использовать переменную в качестве имени переменной?
В качестве ответа на часто задаваемые вопросы, если переменные не индексируются целым числом, вы можете использовать хеш-таблицу:
Используя символические ссылки, вы просто используете хэш-таблицу таблицы символов пакета (например,
%main::
) вместо пользовательского хэша. Решение состоит в том, чтобы вместо этого использовать собственный хэш или реальную ссылку.$USER_VARS{"fred"} = 23; my $varname = "fred"; $USER_VARS{$varname}++; # not $$varname++
Вы должны прочитать весь список часто задаваемых вопросов не реже одного раза в год.
Обновление: Я целенаправленно оставил символические ссылки из моего ответа, потому что они не нужны и, вероятно, очень вредны в контексте вашего вопроса. Для получения дополнительной информации см. Почему это глупо для использования переменной как имени переменной?, часть 2 и часть 3 MJD.