比较perl中的两个哈希并列出哪些记录是额外的?

时间:2014-08-13 19:26:18

标签: arrays perl hash comparison

我有两个包含用户记录的文本文件。我必须比较这两个文件,并找出File1中缺少哪些用户。并从file2中删除这些孤儿。

#!/usr/local/bin/perl -w
use strict;
use warnings;
use autodie;
use Text::Diff;
use List::Compare;
use Data::Dumper;

my $Users1 = "Users1.txt";
my $Users2 ="Users2.txt";
my %hash1;
my %hash2;
my %new_hash;
my @sorted_1;
my @sorted_2;
my @list_keys1;
my @list_keys2;

open(my $fh1, '<:encoding(UTF-8)', $Users1) or die "Colud not open the file!";

while(my $record1 = <$fh1>)
{
    chomp $record1;
    my @list1 = split( '/', $record1);

    foreach my $item(@list1)
    {
        $new_hash{$list1[1]} = $list1[0];
        $hash1{$list1[1]} = $list1[0];
    }
    while ( my ($key, $value) = each(%hash1) ) {
    push (@list_keys1, $key);
    @sorted_1 = sort @list_keys1;
    }

}
print "\t\tHash values for USERS1:\n";
print Dumper \%hash1;

open(my $fh2, '<:encoding(UTF-8)', $Users2) or die "Colud not open the file!";

while(my $record2 = <$fh2>)
{
    chomp $record2;
    my @list2 = split( '/', $record2);
    foreach my $item(@list2)
    {
        $hash2{$list2[1]} = $list2[0];

    }

    while ( my ($key, $value) = each(%hash2) )
    {
        push (@list_keys2, $key);
        @sorted_2 = sort @list_keys2;
    }
}
print "\n\n\t\tHash values for Users2:\n";
print Dumper \%hash2;

@hash1{@list_keys1} = 1;
@hash2{@list_keys2} = 1;

foreach(keys %hash2)
{
    print "\nThis user does not exist(to be deleted): $_\n" unless exists $hash1{$_};

}

foreach (keys %hash1)
{
    print "\nNew User (to be added):$_\n" unless exists $hash2{$_};
}

close ($fh1);
close ($fh2);

问题:

  1. 我无法按字母顺序对用户ID(字符串)进行排序(此处,USER ID是长度为7的随机字符串)。在Perl中对数组/哈希进行排序时是否存在任何限制?

  2. 我无法比较两个哈希并获得差异。最有效的方法是什么?

  3. 我是否需要安装任何其他库才能处理这部分代码?

  4. 来自档案的示例记录:

    File1中: 亚洲/ ASEDF46 印度/ PSDfT5V 中国/ FSDfT5V 印度/ AA44TYB 美国/ BBRTT67

    文件2: 印度/ PSDfT5V 中国/ FSDfT5V 印度/ AA44TYB USA / BBRTT67 UK / ZK9EELO

1 个答案:

答案 0 :(得分:0)

use strict;
use warnings;
use autodie;

open my $in, '<', 'in.txt'; 
open my $in2, '<', 'in_2.txt';

my (%data1, %data2);

while(<$in>){
    chomp;
    my @split = split/\//;
    $data1{$split[0]} = $split[1];
}

while(<$in2>){
    chomp;
    my @split = split/\//;
    $data2{$split[0]} = $split[1];
}


foreach(sort keys %data1){
    print "User: $_ Value: $data1{$_}\n" if $data2{$_};
}