【问题标题】:How to print instance name that do not match numerically between 2 files?如何打印两个文件之间数字不匹配的实例名称?
【发布时间】:2013-12-02 08:32:24
【问题描述】:

我想对每个实例名称的 2 个文件进行数字比较,并输出任何不匹配的属性。

Ref.txt:

CELLA CELLA 0.0000 0.0000 0 0 50 47 100 390 798 1000 3349 2938
CELLA/I0/I0 INV 0.0200 0.2210 0 0 20 200 30 100 430 770 230 940
CELLA/I0/I2 INV 1.0400 0.2210 0 0 530 200 250 261 1230 670 1240 390

新建.txt:

CELLA CELLA 0.0000 0.0000 0 0 50 47 100 390 798 1000 3349 2938
CELLA/I0/I2 INV 1.0400 0.2218 0 0 530 200 250 261 1230 670 1240 390
CELLA/I0/I0 INV 0.0200 0.2210 0 0 20 200 30 100 430 770 230 940

预期输出(CELLA/I0/I2 其中 0.2218 不等于 0.2210):

-ERROR: CELLA/I0/I2 has mismatch property.

到目前为止我的代码,我应该如何修复我的代码?

use strict;

my %hash;

sub read_hash {
  my $fname = shift;
  open(my $fh, "<", $fname) or die "$!";
  while (<$fh>) {
    chomp;
    my ($occurname, $tempname, $x, $y, $reflection, $rotation, $xy1, $xy2, $xy3,$xy4,  
 $xy5, $xy6, $xy7, $xy8, $xy9, $xy10, $xy11, $xy12, $xy13) = split /\s+/, $fh;
  }
}

my %hash1 = read_hash("Ref.txt");
my %hash2 = read_hash("New.txt");

if ($hash1{$x}{$y}{$reflection}{$rotation}{$xy1}{$xy2}{$xy3}{$xy4}{$xy5}{$xy6}{$xy7}{$xy8}{$xy9}{$xy10}{$xy11}{$xy12}{$xy13}
    != $hash2{$x}{$y}{$reflection}{$rotation}{$xy1}{$xy2}{$xy3}{$xy4}{$xy5}{$xy6}{$xy7}{$xy8}{$xy9}{$xy10}{$xy11}{$xy12}{$xy13}) {
  print "$occurname has mismatch property";
}
else {
  print "Match\n";
}

【问题讨论】:

  • 您可以从格式化代码开始,使其可读。这次我给你做了,但是请使用空格,尤其是缩进,让你的代码结构和含义更明显。

标签: perl comparison numerical


【解决方案1】:

很抱歉,我不打算通过您的代码来解释所有问题。最大的错误是 嵌套的散列不能那样工作。这是一个完整的修订版,可以满足您的要求。

use strict;
use warnings;

my %ref_data;

open my $fh, '<', 'Ref.txt' or die $!;
while (<$fh>) {
  chomp;
  my ($occurname, $tempname, @data) = split;
  $ref_data{$occurname} = \@data;
}

open $fh, '<', 'New.txt' or die $!;
while (<$fh>) {
  my ($occurname, $tempname, @data) = split;
  my $ref_data = $ref_data{$occurname};
  unless ($ref_data and grep($data[$_] != $ref_data->[$_], 0..$#data) == 0) {
    print "$occurname has mismatch property\n";
  }
}

输出

CELLA/I0/I2 has mismatch property

【讨论】:

  • 0.26 不等于 0.2600 时发生错误。我将 eq 更改为 == 但仍然出现错误。
  • 我真的很想知道这个命令行是关于什么的。除非 ($ref_data 和 grep($data[$_] != $ref_data->[$_], 0..$#data) == 0)
  • @annel:好的,我已经修好了。 自己努力。
【解决方案2】:

您没有从您的子 read_hash 中返回任何内容。

在 while 循环中添加 $hash{$x}{$y}.... = $occurname; 之类的内容,在 sub 末尾添加 return %hash 之类的内容。

【讨论】:

  • OP 不想要十七级哈希。目的似乎是确保从第三列开始的 所有列 对于第一列的给定值是相同的。将数据用作哈希键根本没有帮助。
猜你喜欢
  • 2018-07-12
  • 1970-01-01
  • 2017-10-28
  • 2014-08-28
  • 1970-01-01
  • 1970-01-01
  • 2016-12-09
  • 2012-09-05
  • 1970-01-01
相关资源
最近更新 更多