Я начал изучать 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 день рождения :|).
\E
в/^000\E/
? Эта escape-последовательность используется для завершения других escape-последовательностей, таких как\Q ... \E
. - person TLP   schedule 26.02.2013use Data::Dumper; $Data::Dumper::Useqq = 1; print Dumper \%tokendb, \%tokenfile;
. Или, если это становится слишком запутанным, напечатайте значения в цикле:print Dumper "'$token' ne '$token2'"
- person TLP   schedule 26.02.2013