2012-01-23 11 views
5

quiero hacer lo mismo que a continuaciónCómo puede recorrer constante Perl

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

pero utilizando

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

¿Cómo puedo hacer eso?

+2

'constante de uso' es más problemático de lo que vale aquí. ¿Por qué no simplemente 'nuestro @NUCLEOTIDES = qw (A C G T);' ?? – runrig

+0

Porque la información en esta constante no se va a modificar a lo largo del tiempo de ejecución, aunque en realidad no es tan 'constante' aquí. –

+1

Entonces no lo modifique. – runrig

Respuesta

17
use constant NUCLEOTIDES => [ qw{ A C G T } ]; 

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

Aunque cuidado: Aunque NUCLEÓTIDOS es una constante, los elementos de la matriz que se hace referencia (por ejemplo NUCLEOTIDES->[0]) todavía se pueden modificar.

+0

Muchas gracias, es realmente útil. –

+0

no se olvide de aceptar la respuesta. – dave

1
my $nucleotides = NUCLEOTIDES; 

foreach (@$nucleotides) { 
} 

O usted podría hacer esta función de utilidad:

sub en (@) { retorno @_ == 1 & & ref ($ [0]) eq 'array'? @ {shift()} : @ ; }

Y luego llamarlo así:

for my $n (in NUCLEOTIDES) { 
} 
7

por qué no hacer su declaración de constante una lista?

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

print for NUCLEOTIDES; 

o incluso una lista en el contexto de lista y un ref matriz en contexto escalar:

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

print for NUCLEOTIDES; 

print NUCLEOTIDES->[2]; 

si también necesita acceder con frecuencia elementos individuales.

+0

Su primera función es equivalente a 'use constante NUCLEOTIDES => qw/A C G T /'. –

2

Si desea utilizar el pragma constante, entonces se puede decir simplemente

#!/usr/bin/perl 

use strict; 
use warnings; 

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

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

El elemento de la derecha de la coma grasa (=>) no tiene que ser un valor escalar.

Cuestiones relacionadas