LINUX.ORG.RU

Perl - что использовать в качестве ключа в хэше


0

2

Понемногу изучаю перл. Дошел до того, что надо было создать массив функций, с каждой из которых связан свой хэш.

Сначала я сделал так:

#!/usr/bin/perl
use strict;

sub f1 {
        print "f1\n";
}

sub f2 {
        print "f2\n";
}

my %h2 = (
        \&f1 => "__f1",
        \&f2 => "__f2",
);

for (keys %h2) {
        my $fn = $_;
        print "--[ $fn ]--\n";
        $fn->();
}

Но при запуске

$ ./a.pl 
--[ CODE(0x15a8e50) ]--
Can't use string ("CODE(0x15a8e50)") as a subroutine ref while "strict refs" in use at ./a.pl line 20.

Начал гуглить и пришел к выводу, что в качестве ключа в хэше следует использовать только строки/числа, то есть - то, что представимо в виде строки.

В моем случае он сконвертировал ссылку на функцию в строку. Я поигрался с перлом и пришел к выводу, что он любой ключ в хэше конвертирует в строку.

my %h3 = (
        [ 0, 1, 2 ] => 100,
);

for (keys %h3) {
        my $k = $_;
        print "--[ $k ]--\n";
        print $k->[0], "\n";
}

*** OUTPUT: ****

--[ ARRAY(0x16cb998) ]--
Can't use string ("ARRAY(0x16cb998)") as an ARRAY ref while "strict refs" in use at ./a.pl line 30.

Зачем перл любой ключ в хэше конвертирует в строку? Почему нельзя оставить просто reference на объект?

Короче говоря, я хочу спросить:

1. Правильно я понимаю, что в качестве ключа нужно использовать только то, что нативно представимо в строковом виде (строки, числа)?

2. Зачем перл ключ всегда кастует в строку?

P.S. Решение моей задачи стало таким: я сделал вышеупомянутую структуру как массив хешей, где каждый отдельный хэш имеет строковые ключи и содержит в себе функцию и все нужные мне параметры, связанные с ней.

★★

#!/usr/bin/perl
use strict;

sub f1 {
        print "f1\n";
}

sub f2 {
        print "f2\n";
}

my %h2 = (
        "&f1" => \&f1,
        "&f2" => \&f2,
);

for (keys %h2) {
        my $fn = $_;
        print "--[ $h2{$fn} ]--\n";
        $h2{$fn}->();
}
anonymous2 ★★★★★
()
Ответ на: комментарий от anonymous2

Да, ты ничего не понял. Вместо строк «__fn» у меня стоят хэши со специфичными для каждой функции параметрами. То есть, юзать их как ключи нельзя.

bk_ ★★
() автор топика
Ответ на: комментарий от anonymous2

Спасибо конечно, но я решение нашел. Мой вопрос на понимание почему перл работает так а не иначе.

bk_ ★★
() автор топика

[offtop] Use Python, Luke

>>> {lambda: None: 1}
{<function <lambda> at 0x190d958>: 1}
>>> 

[/offtop]

Virtuos86 ★★★★★
()
Ответ на: гугл от Bad_ptr

Thx

bk_ ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.