2012-01-23 7 views
5

voglio fare lo stesso, come di seguitoCome può ciclo attraverso perl costante

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

ma utilizzando

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

Come posso fare questo?

+2

'usa costante' è più un problema che vale la pena qui. Perché non solo "i nostri @NUCLEOTIDES = qw (A C G T);" ?? – runrig

+0

Poiché le informazioni in questa costante non verranno modificate durante il tempo di esecuzione, anche se qui non è proprio "costante". –

+1

Quindi non modificarlo. – runrig

risposta

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

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

Sebbene attenzione: Sebbene NUCLEOTIDI è una costante, gli elementi della matrice riferimento (ad esempio NUCLEOTIDES->[0]) possono ancora essere modificate.

+0

Grazie mille, è davvero d'aiuto. –

+0

non dimenticare di accettare la risposta. – dave

1
my $nucleotides = NUCLEOTIDES; 

foreach (@$nucleotides) { 
} 

Oppure si potrebbe fare questa funzione di utilità:

sub a (@) { ritorno @_ == 1 & & ref ($ [0]) eq 'allineamento'? @ {shift()} : @ ; }

E poi chiamare in questo modo:

for my $n (in NUCLEOTIDES) { 
} 
7

Perché non rendere il vostro ritorno costante una lista?

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

print for NUCLEOTIDES; 

o anche una lista in contesto lista e di un arbitro per array in un contesto scalare:

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

print for NUCLEOTIDES; 

print NUCLEOTIDES->[2]; 

se anche avete bisogno di accedere frequentemente singoli elementi.

+0

La prima funzione è equivalente a 'usa costante NUCLEOTIDI => qw/A C G T /'. –

2

Se si desidera utilizzare il pragma costante, allora si può solo dire

#!/usr/bin/perl 

use strict; 
use warnings; 

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

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

La voce a destra della virgola grasso (=>) non deve essere un valore scalare.