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

これを機能させるには、厳密な参照をオフにする必要があることを明確にする必要がありました。そのため、コードを use "nostrict" と use "strict" で囲みます。

これは、perl でソフト参照として知られているものです。

于 2011-10-27T20:22:54.633 に答える