在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";
    }
}

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

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"是有效的。

相关内容

  • 没有找到相关文章

最新更新