В Perl можно ссылаться на массив, используя его имя?
Я новичок в 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 ответа
Возможный? Да. Рекомендуемые? Нет В общем, использование символических ссылок является плохой практикой. Вместо этого используйте хеш для хранения ваших массивов. Таким образом, вы можете искать их по имени:
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" };
Вы можете достичь чего-то близкого, используя хэш ссылок на массивы:
%hash = ( 'cats' => [ "Jeffry", "Owen"],
'dogs' => [ "Duke", "Lassie" ] );
$arrayRef = $hash{cats};
Вы также можете использовать eval здесь:
foreach (eval("@$species")) {
print $_ . "\n";
}
Я должен был дать понять, что вам нужно отключить строгие ссылки, чтобы это работало. Так что окружение кода с использованием "nostrict" и использование "strict" работает.
Это то, что называется мягким справочником в Perl.