2010-11-22 20 views
4

Bir değişkenin ilk oluşumu için döngü içinde bir deyim yürütmem gereken bir gereksinimim var. ÖrneğinPerl'lerde flip flop operatörü

: dizisi Verilen benim @rand_numbers = qw(1 2 1 2 3 1 3 2); ben dizideki mevcut sadece 3 değerleri olduğunu biliyoruz
(bu durumda 1,2 yani ve 3)
şey yazdırmak (veya bir şey yapmak) istediğiniz üzerine her değerin ilk karşılaşması (sadece ilk karşılaşmada ve asla karşılık gelen değerin ardışık karşılaşması için tekrar etmeyiniz).

ardından $came_across_x gibi hiçbir değişkenle yukarıdaki sonuca ulaşmak için bir yol var mı bir yaklaşım

my @rand_numbers = qw(1 2 1 2 3 1 3 2); 
my $came_across_1=0, $came_across_2=0, $came_across_3=0; 

for my $x(@rand_numbers) { 
    print "First 1\n" and $came_across_1=1 if($x==1 and $came_across_1==0); 
    print "First 2\n" and $came_across_2=1 if($x==2 and $came_across_2==0); 
    print "First 3\n" and $came_across_3=1 if($x==3 and $came_across_3==0); 
    print "Common op for -- $x \n"; 
} 

mı? [Yani ? Flip-flop operatör yardımıyla]

teşekkür, Ranjith

cevap

11

Bu gerçek yaşam durumu için çalışmayabilir, ama senin numune için çalışır ve size bir fikir verebilir:

my %seen; 
for my $x (@rand_numbers) { 
    print "First $x\n" unless $seen{$x}++; 
    print "Common op for -- $x\n" 
} 
+1

ne yapmak istediğiniz karşılaşabileceğiniz her farklı ürün için aynıdır varsayarsak: Yine görülen değişkenlerin takip etmek gerekir çünkü flip-flop operatörü kullanarak

burada pratik değil gibi görünüyor Bunu kolayca bir altprograma dahil edebilir ve $ {$ x} ++; görünmeyene kadar do_for_first ($ x) yazabilirsiniz. do_for_all ($ x); ' –

+0

Merhaba Chris, benim temel nedenim geçici bir değişken kullanmak değildi [bu durumda '%' 'karma' kullanmış gibi]. Üzgünüm sorusu kafa karıştırıcı olsaydı. Ancak bu senaryo için önerdiğiniz şey en uygun yaklaşımdır, ancak perlindeki mevcut tek katlıları anlamak için sadece flip-flop operatörü (veya başka bir özel değişken/özel operatör) kullanarak bunu yapıp yapamayacağımızı merak ediyorum. – Ranjith

+0

@Ranjith Tek bir hash tablosunu kullanarak, bazijillion zamanının $ $ $ _ $ _ $ _ $ _ $ _ $ _ $ _ $ _ $ _ $ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ n \ n \ n daha esnek ve daha esnek olduğunu unutmayın. –

3

Sadece bir hash değerini @Chris'in önerileriyle kullanın.

my %seen; 
for (@rand_numbers) { 
    print "$_\n" if $_ == 1 && !$seen{$_}++ .. $_ == 1; 
    print "$_\n" if $_ == 2 && !$seen{$_}++ .. $_ == 2; 
    print "$_\n" if $_ == 3 && !$seen{$_}++ .. $_ == 3; 
}