Как сказал Брайан: он все еще делает это, он просто предупреждает вас. Предупреждения говорят вам об определенных манипуляциях с эффектами, которые вы, возможно, не предполагали.
Вы конкретно запрашиваете значение $histogram{$_}
, добавляете 1 к нему и затем назначаете его на тот же слот. То же самое, что я не ожидал бы, что здесь будет работать автовификация:
my $hash_ref = $hash_for{$key_level_1};
$hash_ref->{$key_level_2} = $value;
как здесь:
$hash_for{$key_level_1}{$key_level_2} = $value;
Магия, вероятно, не работает как оптимизация. И оптимизирующий компилятор заметил бы, что a = a + 1
- это то же самое, что и a++
, так что если бы на языке ассемблера был оператор приращения, он мог бы использовать эту оптимизированную инструкцию вместо того, чтобы делать вид, что ему нужно сохранить первое значение, а затем перезаписывать это потому, что это на самом деле не нужно.
Оптимизация - это дополнительная проверка и издержки один раз для повышения производительности при каждом запуске. Но в динамическом языке нет гарантии, что вы не добавляете накладные расходы с той же скоростью, с какой бы вы не пытались их уменьшить.