2012-01-23 10 views
5

chcę zrobić takie same jak poniżejJak pętli Perl stałej

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

ale stosując

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

W jaki sposób można to zrobić?

+2

"Użyj stałej" to więcej kłopotów, niż tu warto. Dlaczego nie tylko "nasze @NUCLEOTIDES = qw (A C G T);" ?? – runrig

+0

Ponieważ informacje w tej stałej nie będą modyfikowane przez cały czas działania, nawet jeśli nie jest to naprawdę "stałe". –

+1

Nie należy go modyfikować. – runrig

Odpowiedz

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

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

Chociaż uwaga: Chociaż nukleotydy stałą elementy wymienionej tablicy (np NUCLEOTIDES->[0]) wciąż może być modyfikowany.

+0

Thx dużo, to naprawdę pomocne. –

+0

nie zapomnij przyjąć odpowiedzi. – dave

1
my $nucleotides = NUCLEOTIDES; 

foreach (@$nucleotides) { 
} 

Albo można zrobić tę funkcję użytkową:

Sub (@) { powrócić @_ == 1 & & ref ($ [0]) eq 'ARRAY'? @ {shift()} : @ ; }

A potem nazwać tak:

for my $n (in NUCLEOTIDES) { 
} 
7

Dlaczego nie uczynić stałym zwróci listę?

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

print for NUCLEOTIDES; 

lub nawet lista w kontekście listowym i ref tablicy w kontekście skalarnym:

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

print for NUCLEOTIDES; 

print NUCLEOTIDES->[2]; 

jeśli trzeba także często dostęp do poszczególnych elementów.

+0

Pierwsza funkcja jest odpowiednikiem 'use constant NUCLEOTIDES => qw/A C G T /'. –

2

Jeśli chcesz użyć stałej pragmy, wtedy można po prostu powiedzieć

#!/usr/bin/perl 

use strict; 
use warnings; 

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

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

pozycja na prawo od przecinka tłuszczu (=>) nie musi być wartością skalarną.