В Perl есть ли способ сделать простую арифметику внутри кавычек? - PullRequest
4 голосов
/ 05 июля 2011
$i = 5;
print "{$i*10}";

Иногда мне может понадобиться сделать что-то, как описано выше, но Perl не интерпретирует это так, как я хочу, и я могу сделать это только с другой переменной. Есть ли хитрость?

Ответы [ 5 ]

11 голосов
/ 05 июля 2011
$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 ().

11 голосов
/ 05 июля 2011

Я предлагаю вам использовать "printf":

printf("%s",$i*10);

Это подойдет.

2 голосов
/ 05 июля 2011
$i = 5;
print "${\($i*10)}";

я не рекомендую это делать!

обновление : (более или менее) эквивалентно:

$i = 5;
$j = ($i * 10);
$k = \$j;
print "${$k}";
1 голос
/ 05 июля 2011

Вы пытаетесь получить доступ к хешу?

Если нет, просто используйте: print "{". ($ I * 10) "}";

1 голос
/ 05 июля 2011

Можете ли вы попробовать следующее,

print "{". $i*10. "}";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...