Perl не может использовать строку в качестве ссылки на массив

У меня есть 4 приложения. назовем их: App1, App2, App3 и App4.

для каждого из этих приложений у меня есть массив: например:

my @App1_links = (...some data...);
my @App2_links = (...some data...);
my @App3_links = (...some data...);
my @App4_links = (...some data...);

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

my $link_name = $app_name . "_links";
    where $app_name will be App1, App2 etc...

and then use it as : @$link_name

Теперь этот код делает то, что я собираюсь делать, когда я не использую: use strict но не иначе

The error is: Can't use string ("App1_links") as an ARRAY ref while "strict refs" in use at code.pm line 123.

Как я могу добиться этой функциональности, используя use strict.

Пожалуйста помоги.


person soothsayer    schedule 19.07.2012    source источник
comment
Было бы неплохо, если бы вы предоставили более осмысленный фрагмент. У вас есть массивы с такими именами и вы пытаетесь получить к ним доступ?   -  person user4035    schedule 19.07.2012
comment
Я думал, что дал достаточно информации. Пожалуйста, скажите мне, что неясно в посте, и я могу это исправить. Имена могут быть любыми, но идея — это то, что я хочу выразить и донести до вас.   -  person soothsayer    schedule 19.07.2012


Ответы (2)


Вы используете $link_name как символическую ссылку, что не разрешено в use strict 'refs'.
Попробуйте вместо этого использовать хэш, например

my %map = (
    App1 => \@App1_links,
    ...
);
my $link_name = $map{$app_name};
person Eugene Yarmash    schedule 19.07.2012
comment
Спасибо за решение. Позвольте мне попробовать это. - person soothsayer; 19.07.2012

Как я уже говорил в другом месте, когда вы добавляете целочисленный суффикс к именам переменных, подумайте "Я должен был использовать массив".

my @AppLinks = (
    \@App1_links,
    \@App2_links,
    \@App3_links,
    # ...
);

for my $app ( @AppLinks ) {
    for my $link ( @$app ) {
        # loop over links for each app
    }
}

or

for my $i ( 0 .. $#AppLinks ) {
    printf "App%d_links\n", $i + 1;
    for my $link ( @{ $AppLinks[$i] } ) {
        # loop over links for each app
    }
}
person Sinan Ünür    schedule 19.07.2012
comment
Мой цикл проходит через 4 приложения, поэтому мне нужно объединить и получить link_name. Мне пришлось бы изменить много кода, чтобы перебрать массив. Любые другие идеи? - person soothsayer; 19.07.2012
comment
Я не вижу веских причин использовать здесь no strict 'refs';. Это решит вашу проблему для некоторого значения решения. Приведенный выше код перебирает все ссылки для всех приложений. - person Sinan Ünür; 19.07.2012