将相同项的值与一个例外情况进行比较

时间:2018-03-16 12:20:57

标签: perl

A,食品,75

B,汽车,136

A,汽车,69

B,商店,80

A,房子,179

B,食品,75

C,汽车,136

ECX5,飞行,50

QC4,火车,95

C,食品,85

B,房子,150

d,商店,80

EAX5,飞行,50

QA4,火车,75

女,电影,

它应该比较相同类型的值(第二列匹配的地方)和打印不同。现在我想要输出:

** A,食物,75与B不匹配,食物,75 C,食物,85

A,汽车,69与C,汽车,136 B,Car,136

不匹配

A,房子,179与B,house,150

不匹配

QC4,火车,95与QA4,火车,75不匹配

F,电影缺失值

我编写的代码如下,但它没有按照我想要的方式打印格式。

  while (FILE) {
   my $line = $_ ;
   my @lines = split /,/, $line ;
   $data{$lines[1]}{$lines[0]} = $lines[2] ;
   }

 foreach my $item (keys %val) {
  foreach my $letter1 (keys %{$val{$item}}) {
 foreach my $letter2 (keys %{$val{$item}}) {
  if ( ($val{$item}{$letter1} != $val{$item}{$letter2}) && ($letter1 ne 
     $letter2) &&  ( (!defined $done{$item}{$letter1}{$letter2}) || 
     (!defined 
   $done{$item}{$letter2}{$letter1}) ) ) {
     print "$item : $letter1, $val{$item}{$letter1}, $letter2 , 
     $val{$item}
   {$letter2}\n" ;
     }


 }

1 个答案:

答案 0 :(得分:-1)

非常难以遵循代码的逻辑 但我似乎得到了理想的结果:

[编辑]代码是根据评论

编辑的
use strict;
use warnings;
my (%hash, 
  );
while(my $line=<DATA>) {
  chomp $line;
  my ($letter, $object, $number)=split /,/, $line;

  ###  here we are dealing with missing values
  if ($number =~ m{^\s*$}) {
    print $line, "missing value\n";
    next;
  }

  ### here we dissever exceptional items apart from the others 
  if ($letter=~m{^E[AC]X\d$}) {
    $object = "exceptional_$object";
  }

  $number+=0; # in case there is whitespace at the end
  push @{$hash{$object}{$number}}, [$letter,$number,$line];
}

for my $object(sort keys %hash) {
  my $oref = $hash{$object};
  if (1==keys %$oref) {
    next;
  }
  my $str;
  for my $item (values %$oref) {
    $str .= $str ? " $item->[0][2]" : "$item->[0][2] is not matching with";
  }
  print ($str,"\n");
}


__DATA__
A,food,75
B,car,136
A,car,69
B,shop,80
A,house,179
B,food,75
C,car,136
ECX5,flight,50
ECX4,train,95
C,food,85
B,house,150
D,shop,80
EAX5,flight,50
EAX4,train,75
F,movie,

<强>输出

F,movie,missing value
A,car,69 is not matching with B,car,136
EAX4,train,75 is not matching with ECX4,train,95
C,food,85 is not matching with A,food,75
A,house,179 is not matching with B,house,150

算法的作用:

通过输入循环,我们记住每对唯一对象和数字的所有行 在完成输入循环后,我们执行以下操作:
对于每个对象,如果它没有不同的数字,我们会跳过它:

if (1==keys %$oref) {
    next
}

如果有,我们从该对象和数字的首先记住的行列表中构建一个输出字符串(即我们省略了对象和数字的重复项); 使用&#34;修改的列表中的第一个项目与&#34;。

不匹配

另外,我正在读取特殊文件句柄DATA,它访问脚本中的嵌入数据。这是为了方便演示代码