2010-11-22 88 views
4

我有一個需求,我需要在第一次出現變量時在循環內部執行語句。perl中的觸發器操作符

例如: 鑑於陣列我@rand_numbers = qw(1 2 1 2 3 1 3 2);
我知道有數組中存在的只有3個值(即在這種情況下,1,2和3)
我要打印的東西(或做某事)上第一次遇到每個值(僅在第一次遇到並且從不重複時纔會連續遇到相應的值)。

下面是一個方法

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"; 
} 

有沒有辦法實現上述結果與像$came_across_x沒有變? [即?用觸發器運營商的幫助下]

感謝, 蘭芝斯

回答

11

這可能不是你的現實生活中的情況下工作,但它的工作原理爲您的樣品,並且可以給你一個想法:

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

假設你想要做什麼是你遇到的每個不同的項目相同,你可以很容易地將它分解成一個子程序並寫出'do_for_first($ x),除非$ seen {$ x} ++; do_for_all($ x);' – 2010-11-22 10:39:33

+0

嗨克里斯,我的主要動機是不使用臨時變量[就像在這種情況下,你已經使用'%看到'哈希]。對不起,如果我的問題很混亂。然而,對於這種情況,你所建議的是最佳方法,但要了解perl中的可用單行程序,我想知道是否只能使用觸發器操作符(或其他特殊變量/特殊操作符)才能完成此操作。 – Ranjith 2010-11-22 15:28:41

+0

@Ranjith請注意,使用單個哈希表比您的'$ came_across_i'變量更好,更靈活。 – 2010-11-22 19:21:55

3

只需使用@Chris建議的散列即可。

使用觸發器運營商似乎在這裏不實用,因爲你需要跟蹤看到變量的反正:

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