我是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";
}
}
可能吗?是的。推荐吗?没有。一般来说,使用符号引用是不好的做法。相反,使用散列来保存数组。这样您就可以通过名称查找它们:
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";
}
我应该说清楚,你需要关闭严格的refs工作。所以在代码周围使用"nostrict"one_answers"strict"是有效的。