Как обновить значение хеша, используя ссылку на хеш в Perl?

Есть ли способ обновить значение в хэше, используя ссылку на хеш, которая указывает на значение хеша?

Мой хэш-вывод выглядит так:

    'Alternate' => {
        'free' => '27.52',
        'primary' => 'false',
        'used' => '0.01',
        'name' => '/mydir/journal2',
        'size' => '50.00'
     },
    'Primary' => {
        'free' => '60.57',
        'primary' => 'true',
        'used' => '0.06',
        'name' => '/mydir/journal',
        'size' => '64.00'
    }
};

Я попытался создать хеш-ссылку на свойство used в хеше и попытался обновить значение:

$hash_ref = \%hash->{"Primary"}->{used};
$hash_ref = "99%";
print $$hash_ref, "\n";

Это меняет значение хэша, но я получаю "Использование хэша в качестве ссылки не рекомендуется в строке X". Я хотел бы знать, возможно ли то, что я пытаюсь сделать, и что я делаю неправильно.

Спасибо

2 ответа

 ...
'Primary' => {
    'free' => '60.57',
    'primary' => 'true',
    'used' => '0.06',
    'name' => '/mydir/journal',
    'size' => '64.00'
}
 ...

Попробуйте обойти проблему устаревания, сделав так:

 ...
my $hash_ref = $hash{'Primary'}; # if you declared `%hash = ( .. );`
# or my $hash_ref = $hash->{'Primary'}; if you declared `$hash = { .. };`
print $hash_ref->{used}; # prints 0.06
$hash_ref->{used} = '0.07'; # update
print $href->{used}; # prints 0.07
 ...

Perldsc, если вы хотите узнать больше.

Ваш провал начался, потому что вы пытались создать хеш-ссылку на скаляр. Это своего рода бессмысленная цель, так как это разные типы данных. Как уже продемонстрировал Филиппо, у вас уже есть хеш-ссылки в качестве значений вашего большего хеша, так что вы можете на это положиться.

Однако, если вы действительно хотите создать ссылку на скаляр, так что вы можете просто отредактировать это значение, вот как вы это сделаете:

use strict;
use warnings;

my $h = {
    'Alternate' => {
        'free' => '27.52',
        'primary' => 'false',
        'used' => '0.01',
        'name' => '/mydir/journal2',
        'size' => '50.00',
     },
    'Primary' => {
        'free' => '60.57',
        'primary' => 'true',
        'used' => '0.06',
        'name' => '/mydir/journal',
        'size' => '64.00',
    }
};

my $primary = $h->{Primary};
print $primary->{used}, "\n"; # outputs 0.06

my $usedref = \$h->{Primary}{used};
$$usedref = '0.07';

print $primary->{used}, "\n"; # outputs 0.07
Другие вопросы по тегам