[Perl]關于 NDBM_File 的奇怪事

準備把本站的 Tag索引 寫入 DBM ,折騰了一段Perl 小程序,使用了 NDBM_File 模塊, 結果稀奇古怪。

代碼如下;

#!/usr/bin/perl -w

use strict;
use CGI;
my $tagdir ='/blog/tag';
my $q = CGI->new;
print $q->header(-charset => 'utf-8');

use NDBM_File;
use Fcntl;

&do_tag_db();

sub do_tag_db
{
    my $all_tag_text =  $tagdir .'/tag.txt';
    return 1 unless (-s  $all_tag_text);
       
    my $all_tag_db =  $tagdir .'/tag.db';
    return 1 if (-s  $all_tag_db);

    if (open my $fh, $all_tag_text) {
       tie (my %DB, 'NDBM_File', $all_tag_db,O_RDWR|O_TRUNC|O_CREAT, 0666);
        my @list =split ',', <$fh>;
        close $fh;
        foreach my $tmp (@list)   { $DB{$tmp}  =  &getCacheFileName($tmp) ;  }
        untie %DB;
   }
   return 0;
}

sub getCacheFileName {
    my($str) = @_;
    $str =~ s!([^a-zA-Z0-9_.~-])!lc sprintf "%02x", ord($1)!eg;
    $str;
}

1;
程序正常運行。但是在目标目錄并沒有發現所需要的 tag.db 文件, 而是一對文件,名字為 tag.db.dir 和 tag.db.pag

把上述文件的
use NDBM_File;
...
tie (my %DB, 'NDBM_File', $all_tag_db,O_RDWR|O_TRUNC|O_CREAT, 0666);
換成
use DB_File;
...
tie (my %DB, 'DB_File', $all_tag_db,O_RDWR|O_TRUNC|O_CREAT, 0666);
即改用 DB_File, 則一切正常。 tag.db 正常生成。

是什麼原因呢?? 難道 NDBM_File 模塊還有啥意外的用法? 看來 Perl 真的荒廢很久了。。。