Я не рекомендую оценивать сложное выражение, подобное этому внутри интерполирующих строк, но вы можете сделать это двумя способами.Прежде чем я покажу вам это, позвольте мне рассказать вам, как работает интерполяция.Он в основном предназначен для того, чтобы вы могли без особых суеты связывать переменные с литералами.
(( $diff / $last ) * $_->{label} )
- это не переменная, это выражение .Однако хеш-индекс $_->{label}
также является выражением, хотя и более простым, главным образом касающимся индексации переменной для поиска значения, хранящегося в нем.Разница в том, что все дело в нескольких операциях, а не в попытке отобразить уже сохраненные данные.
Однако, поскольку логика интерполяции должна была анализировать иногда сложные выражения, вы можете интерполировать практически любое выражение - если оно «сформулировано» как индексация или разыменование.
Вы можете выполнить разыменование выражения:
print "${\(($diff/$last)*$_->{label})}\t";
Здесь вы 1) разрешаете выражение и 2) берете ссылку на его расположение в памяти, а затем 3) разыменовываете этот раздел памяти.Так что это как разыменование, только с помощью вычислений.
Существует также интерполяция литерального массива:
print "@{[ \(($diff/$last)*$_->{label}) ]}\t";
Здесь вы создаете литеральный массив с одним членом, значением которого является выражение, и вы используетечтобы иметь массивную интерполяцию.
Опять же, они ни в коем случае не являются действительными как часть кодовой базы, которой придется жить в течение нескольких лет.Однако это дешевые и грязные уловки, которые позволяет выразительная сила Perl.