В Perl можно ссылаться на массив, используя его имя? - PullRequest
1 голос
/ 28 октября 2011

Я новичок в Perl и понимаю, что вы можете вызывать функции по имени, например так: &$functionName();. Тем не менее, я хотел бы использовать массив по имени. Возможно ли это?

Длинный код:

sub print_species_names {
    my $species = shift(@_);
    my @cats = ("Jeffry", "Owen");
    my @dogs = ("Duke", "Lassie");

    switch ($species) {
        case "cats" {
            foreach (@cats) {
                print $_ . "\n";
            }
        }
        case "dogs" {
            foreach (@dogs) {
                print $_ . "\n";
            }
        }
    }
}

Ищу более короткий код, похожий на этот:

sub print_species_names {
    my $species = shift(@_);
    my @cats = ("Jeffry", "Owen");
    my @dogs = ("Duke", "Lassie");

    foreach (@<$species>) {
        print $_ . "\n";
    }
}

Ответы [ 3 ]

15 голосов
/ 28 октября 2011

возможно? Да. Рекомендуемые? Нет . В общем, использование символических ссылок является плохой практикой. Вместо этого используйте хеш для хранения ваших массивов. Таким образом, вы можете искать их по имени:

sub print_species_names {
    my $species = shift;
    my %animals = (
        cats => [qw(Jeffry Owen)],
        dogs => [qw(Duke Lassie)],
    );
    if (my $array = $animals{$species}) {
        print "$_\n" for @$array
    }
    else {
        die "species '$species' not found"
    }
}

Если вы хотите уменьшить это значение, вы можете заменить блок if / else на:

    print "$_\n" for @{ $animals{$species}
        or die "species $species not found" };
4 голосов
/ 28 октября 2011

Вы можете достичь чего-то близкого, используя хэш ссылок на массивы:

%hash = ( 'cats' => [ "Jeffry", "Owen"],
          'dogs' => [ "Duke", "Lassie" ] );

$arrayRef = $hash{cats};
0 голосов
/ 28 октября 2011

Вы также можете использовать eval здесь:

foreach (eval("@$species")) {
        print $_ . "\n";
    }

Я должен был дать понять, что вам нужно отключить строгие ссылки, чтобы это работало.Так что окружение кода с использованием «nostrict» и использование «strict» работает.

Это то, что называется мягким справочником в Perl.

...