в Perl, как использовать значение переменной в качестве хеш-элемента - PullRequest
1 голос
/ 14 февраля 2012

Я новичок в Perl и не могу найти ответ на этот вопрос в книге «Изучение Perl».

Например, у меня есть такой массив:

my @loop=("op1_sel","op2_sel");

и дваХеш-таблица как:

my %op1_sel=(
       "bibuf","000",
       "self","101"
            );
my %op2_sel=(
        "zero","1",
        "temp","0"
            );

Теперь я хочу использовать переменные в цикле для цикла для хеш-таблицы для определенного ключа, например:

foreach(@loop)
{
     print  ${$_}{"bibuf"} ;
}

Но, похоже, не работает,Я знаю, что ${$_} часть неверна, может кто-нибудь сказать мне, как это исправить?

Ответы [ 3 ]

5 голосов
/ 14 февраля 2012

Использовать вложенные хэши. Как это:

my %op;
# put a hash reference into hash, twice
$op{op1_sel} = \%op1_sel; 
$op{op2_sel} = \%op2_sel;

# later ...
foreach (keys %op) {
    print "bibuf of $_: $op{$_}->{bibuf}\n";
};

Или, если коротко, просто

my %op = (
    op1_sel => { 
        foo => 1,
        bar => 2,
        # ...
    },
    op2_sel => {
        # ...
    },
};

Конструкция {} создает ссылку на анонимный хэш и является стандартным способом обработки вложенных структур данных.

См. Также perldoc perldsc .

2 голосов
/ 14 февраля 2012

Нельзя ссылаться на лексические (my) переменные, используя синтаксис $ {$ foo}. Возможно, вы могли бы заставить это работать, если бы они были переменными пакета, но это не будет правильным способом сделать это.

Правильный способ сделать это - использовать вложенную структуру данных.

Я вижу два очевидных способа сделать это. Вы можете создать массив op_sel, содержащий непосредственно внутренние хэши, или создать хэш хэшей, а затем внести в него индекс.

Итак, "массив хешей":

my @op_sels = (
    {
        bibuf => '000',
        self  => '101',
    },
    {
        zero => '1',
        temp => '0',
    },
);

for my $op (@op_sels) {
    print $$op{bibuf};
}

и "хэш хэшей":

my %op_sels = (
    1 => {
       bibuf => '000',
       self  => '101',
    },
    2 => {
        zero => '1',
        temp => '0',
    },
);

for my $op_key (sort keys %op_sels) {
    print $op_sels{$op_key}{bibuf};
}
1 голос
/ 14 февраля 2012

Вы можете использовать eval для этого.

foreach(@loop)
{
      eval "\%var = \%$_";
      print $var{"bibuf"} ;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...