Как я могу использовать переменную в качестве имени переменной в Perl?
Мне нужно добиться следующего в Perl
printmsg(@val1, $msg1) if @val1;
printmsg(@val2, $msg2) if @val2;
printmsg(@val3, $msg3) if @val3;
printmsg(@val4, $msg4) if @val4;
printmsg(@val5, $msg5) if @val5;
printmsg(@val6, $msg6) if @val6;
Итак, я написал следующий фрагмент
for(my $i=1; $i < 6; $i++ ) {
printmsg(@val$i, $msg$i) if @val$i;
}
Это не работает и вспыхивает с ошибками.
3 ответа
Всякий раз, когда вы обнаруживаете, что постфиксируете имена переменных с целочисленным индексом, понимайте, что вы должны использовать вместо этого массив:
my @msgs = ('msg1', 'msg2', ..., 'msg6');
my @vals = ( [ @val1 ], [ @val2 ], ..., [ @val6 ] );
См. Также FAQ. Как я могу использовать переменную в качестве имени переменной?
В ответ на примечания к FAQ, если переменные не проиндексированы целым числом, вы можете использовать хеш-таблицу:
Используя символьные ссылки, вы просто используете хеш таблицы символов пакета (например,
%main::
) вместо пользовательского хэша. Решение состоит в том, чтобы использовать вместо этого собственный хэш или реальную ссылку.$USER_VARS{"fred"} = 23; my $varname = "fred"; $USER_VARS{$varname}++; # not $$varname++
Вы должны читать весь список часто задаваемых вопросов, по крайней мере, один раз в год.
Обновление: я специально исключил символические ссылки из своего ответа, потому что они не нужны и, вероятно, очень вредны в контексте вашего вопроса. Для получения дополнительной информации см. Почему глупо "использовать переменную как имя переменной"?, часть 2 и часть 3 от MJD.
Вы не можете просто соединить переменные вместе и получить результирующую переменную. Вы могли бы оценить выражение $msg + i
, но, вероятно, лучше сделать msg массивом и просто индексировать: $msg[$i]
,
Если я понимаю, вам нужно "Eval"!
for(my $i=1; $i < 6; $i++ ) {
eval 'printmsg(@val'. $i . ', $msg' . $i .') if @val' . $i;
}
Но помни! Вся переменная (@val1, @val2, ..., @valN) должна существовать! Поскольку вы не предоставляете слишком много своего кода, я не могу сделать вывод об этой проблеме. Может быть, вы могли бы предоставить больше кода, а?