我是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'
请帮忙
答案 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";
}
}
再试一次。