В Perl, как я могу вернуть связанный хеш из подпрограммы? - PullRequest
5 голосов
/ 29 октября 2010

Я хочу иметь подпрограмму perl, которая создает и возвращает упорядоченный хеш через модуль Tie :: IxHash.Это выглядит примерно так:

sub make_ordered_hash {
    my @hash_contents = munge_input(@_); # I get a list of alternating keys and values
    tie(my %myhash, Tie::IxHash, @hash_contents);
    return %myhash;
}

Теперь, если я сделаю my %ordered_hash = make_ordered_hash(@input_stuff), будет действительно привязан% order_hash или он распакует% myhash в список, а затем создаст новый (обычный, неупорядоченный) хэш из этого списка?Если я не могу вернуть связанный хэш таким образом, могу ли я вернуть ссылку на него?То есть я могу исправить это, сделав make_ordered_hash вместо \%myhash?

1 Ответ

6 голосов
/ 29 октября 2010

Нет. Когда вы делаете это, вы возвращаете копию содержимого хэша, и эта копия НЕ связана, как вы и предполагали во втором абзаце.

Вы также правы в том, что для достижения своего результата вам нужно вместо этого вернуть ссылку на связанный хеш: return \%myhash;

Пример

use Tie::IxHash;

sub make_ordered_hash {
    my @hash_contents = (1,11,5,15,3,13);
    tie(my %myhash, Tie::IxHash, @hash_contents);
    return %myhash;
}
sub make_ordered_hashref {
    my @hash_contents = (1,11,5,15,3,13);
    tie(my %myhash, Tie::IxHash, @hash_contents);
    return \%myhash;
}

my @keys;

my %hash1 = make_ordered_hash();
@keys = keys %hash1;
print "By Value = @keys\n";

my $hash2 = make_ordered_hashref();
@keys = keys %$hash2;
print "By Reference = @keys\n";

Результат:

By Value = 1 3 5
By Reference = 1 5 3
...