как распечатать скалярное значение первого другого значения - PullRequest
0 голосов
/ 12 октября 2018

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

#!/usr/bin/perl
use warnings;
use strict;
use Tie::IxHash;    

my %KEY_VALUE;
tie %KEY_VALUE,'Tie::IxHash';


my %KEY_VALUE= (
    0 => ['A','A','C','B','D'],
    1 => ['C','C','C','F','E','E'],
    2 => ['Z','X','X','A','A','Y','Y'],
    3 => ['A','A','B','B'],
    4 => ['E','E','R','M','M'],
    5 => ['D','F','F','F','E','E'],
    );

 while (my ($k, $v) = each %KEY_VALUE) 
{
  print "KEY= $k  ";
  print scalar "VALUE= @$v\n"; #But this will print all the value
}

Требуемый вывод:

KEY= 0  VALUE:0 2 3 4   #The scalar value of first A C B D, start with 0
KEY= 1  VALUE:0 3 4     #The scalar value of first C F E
KEY= 2  VALUE:0 1 3 5   #The scalar value of first Z X A Y
KEY= 3  VALUE:0 2       #The scalar value of first A B
KEY= 4  VALUE:0 2 3     #The scalar value of first E R M
KEY= 5  VALUE:0 1 4     #The scalar value of first D F E

Ответы [ 2 ]

0 голосов
/ 12 октября 2018
my @vals = qw( Z X X A A Y Y );

my %seen;
my @positions = grep { !$seen{ $vals[$_] }++ } 0..$#vals;

Это решение работает, даже если идентичные строки не были сгруппированы.

0 голосов
/ 12 октября 2018

Заменить

print scalar "VALUE= @$v\n"; #But this will print all the value

на

say "VALUE:0 ", join ' ', grep $v->[$_] ne $v->[$_ - 1], 1 .. $#$v;
  • ноль всегда печатается
  • показывают только те индексы, для которых соответствующий элемент отличается от предыдущегоone

Это работает, только если одна и та же буква никогда не появляется за пределами группы первого появления (например, A A B B A не происходит).Если это может произойти, посмотрите ответ ikegami с хешем, чтобы отслеживать уже сообщенные письма.

...