在perl中比较数组的散列时发出问题

时间:2014-04-16 06:26:43

标签: perl

我是Perl的新手,需要快速完成任务。任何帮助表示赞赏!

我有两个数组哈希如下:

Hash 1
-------
abc.txt: ['0744','0']
xyz.txt: ['0744','0']

Hash 2
-------
abc.txt: ['0766','0']
x.txt: ['0744','0']

我必须比较这两个哈希打印3件事:
1. Hash2中添加的文件
2. Hash2中丢失的文件
3.两个哈希中都存在的文件(键)但属性(值)不同。

print "-------------------------ADDED FILES--------------------------------";
foreach (keys %hash2){
    print "added $_\n" unless exists $hash1{$_};
}

print "-------------------------MISSING FILES--------------------------------";
foreach (keys %hash1){
    print "Missing $_\n" unless exists $hash2{$_}; 
}

print "-------------------------Different permissions--------------------------------";

foreach my $key2 ( keys %hash2 ) {
    unless ( exists $hash1{$key2} ) { next; };
    if (join(",", sort @{ $hash1{$_}})
      eq join(",", sort @{ $hash2{$_}}) ){
      }
      else{
          print "value is different";
      }
}

问题是当键是相同的时。这对于每个循环都不能正常工作。我想这样打印:

  

FileName:文件属性之前:文件属性之后
  abc.txt:'0744','0':0766','0'

请帮忙

2 个答案:

答案 0 :(得分:1)

您的代码无效,因为您在my $key2循环中定义了foreach,这使得$_成为空值。

此外,您不需要加入哈希值。在数组值上尝试使用smartmatch运算符,当你想要输出时,它只需要进行连接就会更有效。

foreach my $key2 ( keys %hash2 ) {
    unless ( exists $hash1{$key2} ) { next; };
    unless ( $hash1{$key2} ~~ $hash2{ $key2 } )
    {
        print "$key2: ".join(",", @{ $hash1{$key2}}).": ".join(",", @{ $hash2{$key2}})."\n"
    }
}

答案 1 :(得分:0)

更改

foreach my $key2 ( keys %hash2 ) {
    unless ( exists $hash1{$key2} ) { next; };
    if (join(",", sort @{ $hash1{$_}})
      eq join(",", sort @{ $hash2{$_}}) ){
      }
      else{
          print "value is different";
      }
}

foreach my $key2 ( keys %hash2 ) {
    next unless ( exists $hash1{$key2} );
    my $val1 = join(",", sort @{ $hash1{$key2} });
    my $val2 = join(",", sort @{ $hash2{$key2} });
    if ($val1 eq $val2) {
        # values are same
    }
    else {
        print "$key2 $val1 $val2\n";
    }
}

再试一次。