Понемногу изучаю перл. Дошел до того, что надо было создать массив функций, с каждой из которых связан свой хэш.
Сначала я сделал так:
#!/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. Решение моей задачи стало таким: я сделал вышеупомянутую структуру как массив хешей, где каждый отдельный хэш имеет строковые ключи и содержит в себе функцию и все нужные мне параметры, связанные с ней.