$i = 5;
print "${\($i*10)}";
или
print "@{[$i*10]}";
Они интерполируют «переменную», которая является разыменованием кодового блока, который содержит ссылку соответствующего типа (скаляр в первом случае, массив во втором).
Другим способом было бы иметь фиктивный хеш, который всегда возвращает ключ как значение:
use strict;
use warnings;
{
package Tie::Hash::Dummy;
use Tie::Hash;
use parent -norequire => 'Tie::StdHash';
sub FETCH { $_[1] }
tie our %Lookup, __PACKAGE__;
}
my $i = 5;
print "$Tie::Hash::Dummy::Lookup{$i*10}";
Другой способ - использовать интерфейс поиска имен \N{}
, хотя он будет связывать переменные из другого места и во время компиляции (а также использовать строку eval, что может быть проблемой безопасности):
my $i;
BEGIN { $i = 5 }
BEGIN { $^H{'charnames'} = sub { eval $_[0] } }
print "\N{$i*10}";
( может работать лучше, если обработчик charnames вернул перегруженный прокси-объект, который выполнил eval при строковой классификации, но у меня нет времени, чтобы попробовать это).
Еще одним способом было бы установить обработчик строковой константы с помощью overload :: constant ().