我上周开始学习Perl。比较两个关联数组
我有一个包含'令牌'的文件的关联数组 - 只是一堆数字。 我有一个SQL数据库中包含'令牌'的另一个关联数组。
我想看看文件中的任何标记是否不在数据库中。然而,我所做的任何事似乎都不起作用,而我得出的结论是我只是迷惑自己。
我不知道我完全理解关联数组还没有,但这是我的代码,文件哈希的一个片段:
while($row = <FILE>){
if($row =~ /^000\E/){
@tmp=split(/\s+/,$row);
if($tmp[1] ne "Unassigned"){
$tokenfile{$tmp[0]} = $tmp[1] . " " . $tmp[2];
}
}
}
$tmp[1]
+ $tmp[2]
是第一和第二的名字。我后来比较名称,看他们是否相等。不过,我想比较$tmp[0]
- 令牌。这是SQL哈希:
while(@rows = $sth->fetchrow_array){
($name, $passwd, $uid, $gid, $quota, $comment, $gcos, $dir, $shell) = getpwnam("\L$rows[1]\E");
$gcos =~ s/,.*//;
if(!defined($gcos)){
$missing++;
$tokendb{$rows[0]} = $rows[1];
}
else{
$tokendb{$rows[0]} = $gcos;
}
}
$rows[0]
是令牌。
我以为我会使用两个foreach循环像这样:
foreach $token (keys(%tokendb)) {
foreach $token2(keys(%tokenfile)){
if($token ne $token2){
print "$token2 NOT IN DATABASE\n";
}
}
}
但是,让我仍然在数据库中值的很多的结果。
我想知道为什么这不起作用的一些提示。非常令人沮丧,因为我知道这很简单,但是我的大脑今天工作得并不好(尽管这是我的第21个生日:|)。
'/^000 \ E /'中的'\ E'应该表示什么?该转义序列用于终止其他转义序列,如'\ Q ... \ E'。 – TLP 2013-02-26 17:39:32
请尝试此操作调试目的'使用Data :: Dumper; $ Data :: Dumper :: Useqq = 1;打印Dumper \%tokendb,\%tokenfile;'。或者如果这太乱了,打印循环中的值:'print Dumper''$ token'ne'$ token2'“' – TLP 2013-02-26 17:45:11
警告!警告!如果你从一个仍然调用哈希“关联数组”的源代码学习Perl,那么你正在从一个可能超过十五年过时的源学习。 – 2013-02-27 09:31:15