Ini ialah arahan perldbmfilter yang boleh dijalankan dalam penyedia pengehosan percuma OnWorks menggunakan salah satu daripada berbilang stesen kerja dalam talian percuma kami seperti Ubuntu Online, Fedora Online, emulator dalam talian Windows atau emulator dalam talian MAC OS.
JADUAL:
NAMA
perldbmfilter - Penapis DBM Perl
SINOPSIS
$db = mengikat % hash, 'DBM', ...
$old_filter = $db->filter_store_key ( sub { ... } );
$old_filter = $db->filter_store_value( sub { ... } );
$old_filter = $db->filter_fetch_key ( sub { ... } );
$old_filter = $db->filter_fetch_value( sub { ... } );
DESCRIPTION
Empat kaedah "penapis_*" yang ditunjukkan di atas tersedia dalam semua modul DBM yang dihantar
dengan Perl, iaitu DB_File, GDBM_File, NDBM_File, ODBM_File dan SDBM_File.
Setiap kaedah berfungsi sama, dan digunakan untuk memasang (atau menyahpasang) satu DBM
Penapis. Satu-satunya perbezaan di antara mereka ialah tempat penapis dipasang.
Untuk meringkaskan:
filter_store_key
Jika penapis telah dipasang dengan kaedah ini, ia akan digunakan setiap kali anda
tulis kunci kepada pangkalan data DBM.
filter_store_value
Jika penapis telah dipasang dengan kaedah ini, ia akan digunakan setiap kali anda
tulis nilai pada pangkalan data DBM.
filter_fetch_key
Jika penapis telah dipasang dengan kaedah ini, ia akan digunakan setiap kali anda
membaca kunci daripada pangkalan data DBM.
filter_fetch_value
Jika penapis telah dipasang dengan kaedah ini, ia akan digunakan setiap kali anda
membaca nilai daripada pangkalan data DBM.
Anda boleh menggunakan mana-mana kombinasi kaedah daripada tiada kepada keempat-empat.
Semua kaedah penapis mengembalikan penapis sedia ada, jika ada, atau "undef" jika tidak.
Untuk memadam penapis lulus "undef" kepadanya.
. Saring
Apabila setiap penapis dipanggil oleh Perl, salinan tempatan $_ akan mengandungi kunci atau nilai untuk menjadi
ditapis. Penapisan dicapai dengan mengubah suai kandungan $_. Kod pulangan daripada
penapis diabaikan.
An Contoh: yang NULL Penamatan masalah.
Penapis DBM berguna untuk kelas masalah di mana anda sentiasa nak buat sama
transformasi kepada semua kunci, semua nilai atau kedua-duanya.
Sebagai contoh, pertimbangkan senario berikut. Anda mempunyai pangkalan data DBM yang anda perlukan
berkongsi dengan aplikasi C pihak ketiga. Aplikasi C menganggap bahawa semua kunci dan nilai
adalah NULL ditamatkan. Malangnya apabila Perl menulis kepada pangkalan data DBM ia tidak menggunakan NULL
penamatan, jadi aplikasi Perl anda perlu menguruskan penamatan NULL itu sendiri. Bila
anda menulis ke pangkalan data anda perlu menggunakan sesuatu seperti ini:
$hash{"$key\0"} = "$value\0";
Begitu juga NULL perlu diambil kira apabila anda mempertimbangkan panjang
kunci/nilai sedia ada.
Adalah lebih baik jika anda boleh mengabaikan isu penamatan NULL di utama
kod aplikasi dan mempunyai mekanisme yang secara automatik menambah NULL penamatan kepada semua
kunci dan nilai apabila anda menulis ke pangkalan data dan mengeluarkannya apabila anda membaca
daripada pangkalan data. Kerana saya pasti anda sudah meneka, ini adalah masalah yang DBM
Penapis boleh diperbaiki dengan mudah.
gunakan ketat;
gunakan amaran;
gunakan SDBM_File;
gunakan Fcntl;
% hash saya;
$nama fail saya = "filt";
nyahpaut $filename;
my $db = tie(%hash, 'SDBM_File', $filename, O_RDWR|O_CREAT, 0640)
atau mati "Tidak boleh membuka $nama fail: $!\n";
# Pasang Penapis DBM
$db->filter_fetch_key ( sub { s/\0$// } );
$db->kunci_stor_penapis ( sub { $_ .= "\0" } );
$db->filter_fetch_value(
sub { tiada amaran 'uninitialized'; s/\0$// } );
$db->filter_store_value( sub { $_ .= "\0" } );
$hash{"abc"} = "def";
$a saya = $hash{"ABC"};
# ...
undef $db;
buka ikatan %hash;
Kod di atas menggunakan SDBM_File, tetapi ia akan berfungsi dengan mana-mana modul DBM.
Mudah-mudahan kandungan setiap penapis itu jelas. Kedua-duanya "mengambil"
penapis mengeluarkan NULL penamat, dan kedua-dua penapis "simpan" menambah NULL penamat.
Satu lagi Contoh: Utama is a C int.
Berikut adalah satu lagi contoh kehidupan sebenar. Secara lalai, setiap kali Perl menulis kepada pangkalan data DBM ia
sentiasa menulis kunci dan nilai sebagai rentetan. Jadi apabila anda menggunakan ini:
$hash{12345} = "sesuatu";
kunci 12345 akan disimpan dalam pangkalan data DBM sebagai rentetan 5 bait "12345". Jika awak
sebenarnya mahu kunci disimpan dalam pangkalan data DBM sebagai C int, anda perlu gunakan
"bungkus" semasa menulis, dan "buka bungkus" semasa membaca.
Berikut ialah Penapis DBM yang melakukannya:
gunakan ketat;
gunakan amaran;
gunakan DB_File;
% hash saya;
$nama fail saya = "filt";
nyahpaut $filename;
$db saya = mengikat % hash, 'DB_File', $nama fail, O_CREAT|O_RDWR, 0666,
$DB_HASH atau mati "Tidak boleh membuka $nama fail: $!\n";
$db->filter_fetch_key ( sub { $_ = unpack("i", $_) } );
$db->kunci_stor_penapis ( sub { $_ = pek ("i", $_) } );
$hash{123} = "def";
# ...
undef $db;
buka ikatan %hash;
Kod di atas menggunakan DB_File, tetapi sekali lagi ia akan berfungsi dengan mana-mana modul DBM.
Kali ini hanya dua penapis telah digunakan; kita hanya perlu memanipulasi kandungan
kunci, jadi anda tidak perlu memasang sebarang penapis nilai.
Gunakan perldbmfilter dalam talian menggunakan perkhidmatan onworks.net