2010-11-22 67 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; 
} 
相关问题