【问题标题】:how to print the scalar value of the first different value如何打印第一个不同值的标量值
【发布时间】:2018-10-13 03:51:20
【问题描述】:

下面的脚本将打印每个键的每个元素的所有标量值,如何仅打印散列中每个元素的第一个标量值。

#!/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

【问题讨论】:

  • 您已经表现出提供过多信息的模式。请发布问题的最小演示。您想对多个数组执行操作以及这些数组由哈希引用的事实是无关紧要的。

标签: perl scalar


【解决方案1】:
my @vals = qw( Z X X A A Y Y );

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

即使没有对相同的字符串进行分组,此解决方案也有效。

【讨论】:

  • 我不知道如何用上面数组的哈希来实现这段代码。
  • 只需将@vals 替换为您要检查的数组即可。
  • 但是对于哈希中的所有数组?
  • 你的意思是每个数组?您已经有一个循环,可以为您提供每个数组
【解决方案2】:

替换

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

say "VALUE:0 ", join ' ', grep $v->[$_] ne $v->[$_ - 1], 1 .. $#$v;
  • 总是打印零
  • 仅显示对应元素与前一个元素不同的索引

这仅适用于相同的字母从未出现在其首次出现的组之外(例如,A A B B A 不会出现)。如果发生这种情况,请查看 ikegami 的答案并使用哈希来跟踪已报告的字母。

【讨论】:

  • 鉴于他们之前的问题(关于将Z X A Y X Y A 重新排列为Z X X A A Y Y),您的假设可能是正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多