Зачем использовать переменную, а не другой метод?
Ну, есть много способов инициализировать хеш с такими значениями. Я бы использовал промежуточную переменную, если бы у меня было небольшое количество связанных ключей для инициализации.
my $cv1 = sub_result() * 5;
my $cv2 = "Number: $cv1";
my %h = (
k1 => $cv1,
k2 => $cv2,
k3 => "Numero: $cv1",
k4 => "Big $cv2",
k5 => "Round $cv2",
k6 => "Whole $cv2",
k7 => "-$cv1",
);
Однако, если бы мне пришлось создавать много сложных значений, которые зависели от множества разных ключей, я бы, вероятно, использовал бы управляемый данными подход для инициализации хэша. Точная реализация будет зависеть от деталей, которых у меня нет, но это может выглядеть примерно так:
use Scalar::Util qw(reftype);
my @init = (
[ key1 => $value ],
[ key2 => \&make_a_value, 'key1' ],
[ key3 => \&another_way, 'key2' ],
);
my %h;
for my $spec ( @init ) {
my $key = shift @$spec;
my $value = shift @$spec;
my @args = @$spec;
if( reftype $value eq reftype sub {} ) {
$value = $value->( @h{ @args } );
}
$h{$key} = $value;
}
В любом случае, когда возникает этот вопрос, выбор того, какую технику использовать, зависит от многих деталей, характерных для этого экземпляра. Таким образом, мы остаемся с необходимостью делать общие заявления. Промежуточные переменные являются одним из хороших способов решения проблемы ОП. Должны ли они использоваться в его конкретном случае, я не могу сказать.