Как можно пройти через константу Perl - PullRequest
5 голосов
/ 23 января 2012

Я хочу сделать так же, как показано ниже

my @nucleotides = ('A', 'C', 'G', 'T');
foreach (@nucleotides) {
    print $_;
}

но с использованием

use constant NUCLEOTIDES => ['A', 'C', 'G', 'T'];

Как я могу это сделать?

Ответы [ 4 ]

17 голосов
/ 23 января 2012
use constant NUCLEOTIDES => [ qw{ A C G T } ];

foreach (@{+NUCLEOTIDES}) {
    print;
}

Хотя будьте осторожны: хотя NUCLEOTIDES является константой, элементы ссылочного массива (например, NUCLEOTIDES->[0]) все еще могут быть изменены.

7 голосов
/ 23 января 2012

Почему бы не сделать свой постоянный возврат списка?

sub NUCLEOTIDES () {qw(A C G T)}

print for NUCLEOTIDES;

или даже список в контексте списка и ссылка на массив в скалярном контексте:

sub NUCLEOTIDES () {wantarray ? qw(A C G T) : [qw(A C G T)]}

print for NUCLEOTIDES;

print NUCLEOTIDES->[2];

, если вам также часто требуется доступ к отдельным элементам.

2 голосов
/ 23 января 2012

Если вы хотите использовать постоянную прагму, тогда вы можете просто сказать

#!/usr/bin/perl

use strict;
use warnings;

use constant NUCLEOTIDES => qw/A C G T/;

for my $nucleotide (NUCLEOTIDES) {
   print "$nucleotide\n";
}

Элемент справа от жирной запятой (=>) не обязательно должен быть скалярным значением.

1 голос
/ 23 января 2012
my $nucleotides = NUCLEOTIDES;

foreach ( @$nucleotides ) { 
}

Или вы можете сделать эту служебную функцию:

sub in (@) {return @_ == 1 && ref ($ [0]) eq 'ARRAY'?@ {shift ()}: @ ;}

А затем назовите это так:

for my $n ( in NUCLEOTIDES ) { 
}
...