我有一个要求,我需要在第一次出现变量的循环中执行一个语句。
例如:
给定数组@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
这样的变量的情况下达到上述结果? [即在触发器操作员的帮助下?]
谢谢, 兰芝斯
答案 0 :(得分:11)
这可能对您的实际情况不起作用,但它适用于您的样本,并可能会给您一个想法:
my %seen;
for my $x (@rand_numbers) {
print "First $x\n" unless $seen{$x}++;
print "Common op for -- $x\n"
}
答案 1 :(得分: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;
}