Нельзя использовать строку («VIEW_hash») в качестве ссылки HASH, в то время как «строгие ссылки» используются в строке test.pl 10 - PullRequest
1 голос
/ 19 сентября 2011

Привет, мне действительно нужна переменная в качестве хеш-имени.Но я получаю эти ошибки.Может кто-нибудь помочь ??

#!/usr/bin/perl -w

use strict;

my %VIEW_hash = ( 'a' => 'A', 'b' => 'B', 'c' => 'C');
my $X = "VIEW";
my $name = "$X"."_hash";

foreach my $in (keys %$name){
    print "$in -- $$name{$in}\n";
}

Ответы [ 2 ]

5 голосов
/ 19 сентября 2011

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

Рассмотрите возможность использования хеша для хранения текстовых ссылок на ваш фактический массив:

my %VIEW_hash = ( 'a' => 'A', 'b' => 'B', 'c' => 'C');
my $X = "VIEW";
my $name = "$X"."_hash";

# Our new code
my %meta = ( "VIEW_hash" => \%VIEW_hash );
my $href = $meta{$name};

say @$href{"a".."c"};
say $href->{a}
2 голосов
/ 19 сентября 2011

Я что-то изменил, но это может соответствовать вашим потребностям.

Прежде всего, вы должны использовать прагму no strict 'refs', чтобы использовать символические ссылки. Затем вам нужно переключиться с лексической переменной на переменную пакета (определяется с помощью our).

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

#!/usr/bin/perl -w

use strict;
{
    no strict 'refs';
    our %VIEW_hash = ( 'a' => 'A', 'b' => 'B', 'c' => 'C');
    my $X    = 'VIEW';
    my $name = "$X".'_hash';

    foreach ( keys %$name ) {
        printf "%s -- %s\n", $_, $$name{ $_ };
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...