Оператор триггера в Perl - PullRequest
       4

Оператор триггера в Perl

4 голосов
/ 22 ноября 2010

У меня есть требование, когда мне нужно выполнить инструкцию внутри цикла для первого вхождения переменной.

Например: данный массив my @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?[то есть с помощью оператора триггера?]

Спасибо, Ранджит

Ответы [ 2 ]

11 голосов
/ 22 ноября 2010

Это может не сработать для вашей реальной ситуации, но работает для вашего образца и может дать вам представление:

3 голосов
/ 22 ноября 2010

Просто используйте хэш, как подсказывает @Chris.

Использование оператора триггера здесь нецелесообразно, так как вам все равно придется отслеживать видимые переменные:

my %seen;
for (@rand_numbers) {
    print "$_\n" if $_ == 1 && !$seen{$_}++ .. $_ == 1;
    print "$_\n" if $_ == 2 && !$seen{$_}++ .. $_ == 2;
    print "$_\n" if $_ == 3 && !$seen{$_}++ .. $_ == 3;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...