我有两个包含用户记录的文本文件。我必须比较这两个文件,并找出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);
问题:
我无法按字母顺序对用户ID(字符串)进行排序(此处,USER ID是长度为7的随机字符串)。在Perl中对数组/哈希进行排序时是否存在任何限制?
我无法比较两个哈希并获得差异。最有效的方法是什么?
我是否需要安装任何其他库才能处理这部分代码?
来自档案的示例记录:
File1中: 亚洲/ ASEDF46 印度/ PSDfT5V 中国/ FSDfT5V 印度/ AA44TYB 美国/ BBRTT67
文件2: 印度/ PSDfT5V 中国/ FSDfT5V 印度/ AA44TYB USA / BBRTT67 UK / ZK9EELO
答案 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{$_};
}