1

我是 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";
    }
}
4

3 回答 3

15

可能的?是的。受到推崇的?没有。一般来说,使用符号引用是不好的做法。相反,使用散列来保存您的数组。这样您就可以按名称查找它们:

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" };
于 2011-10-27T20:08:04.600 回答
4

您可以通过使用数组引用的哈希来实现接近的目标:

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

$arrayRef = $hash{cats};
于 2011-10-27T20:08:42.207 回答
0

你也可以在这里使用 eval:

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

我应该明确表示您需要关闭严格的参考才能使其正常工作。因此,使用“nostrict”围绕代码并使用“strict”可以正常工作。

这就是 perl 中所谓的软引用。

于 2011-10-27T20:22:54.633 回答