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" ;
}
}
答案 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,它访问脚本中的嵌入数据。这是为了方便演示代码