⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 databaseaccess.mht

📁 Perl 编程技巧大全。适合初学者阅读。
💻 MHT
📖 第 1 页 / 共 5 页
字号:

<FONT color=3D#ffa500>unless</FONT> <FONT color=3D#00ffff>(</FONT><FONT =
color=3D#cdad00>@ARGV</FONT> =3D=3D <FONT color=3D#cdcd00>2</FONT><FONT =
color=3D#00ffff>)</FONT> <FONT color=3D#00ffff>{</FONT>
    <FONT color=3D#ffa500>die</FONT> <FONT color=3D#00cd00>"usage: =
db2gdbm infile outfile\n"</FONT><FONT color=3D#00ffff>;</FONT>
<FONT color=3D#00ffff>}</FONT>

<FONT color=3D#ffa500>my</FONT> <FONT color=3D#00ffff>(</FONT><FONT =
color=3D#9ac0cd>$infile</FONT>, <FONT =
color=3D#9ac0cd>$outfile</FONT><FONT color=3D#00ffff>)</FONT> =3D <FONT =
color=3D#cdad00>@ARGV</FONT><FONT color=3D#00ffff>;</FONT><FONT =
color=3D#43cd80>                     </FONT>
<FONT color=3D#ffa500>my</FONT> <FONT color=3D#00ffff>(</FONT><FONT =
color=3D#cdcd00>%db_in</FONT>, <FONT color=3D#cdcd00>%db_out</FONT><FONT =
color=3D#00ffff>);</FONT><FONT color=3D#43cd80>                          =
     </FONT>

<FONT color=3D#bebebe># open the files
</FONT><FONT color=3D#ff7f50>tie</FONT><FONT =
color=3D#00ffff>(</FONT><FONT color=3D#cdcd00>%db_in</FONT>, <FONT =
color=3D#00cd00>'DB_File'</FONT>, $infile<FONT color=3D#00ffff>)</FONT>
    <FONT color=3D#98fb98>or</FONT> <FONT color=3D#ffa500>die</FONT> =
<FONT color=3D#00cd00>"Can't tie $infile: $!"</FONT><FONT =
color=3D#00ffff>;</FONT>
<FONT color=3D#ff7f50>tie</FONT><FONT color=3D#00ffff>(</FONT><FONT =
color=3D#cdcd00>%db_out</FONT>, <FONT =
color=3D#00cd00>'GDBM_File'</FONT>, $outfile, GDBM_WRCREAT, <FONT =
color=3D#cdcd00>0666</FONT><FONT color=3D#00ffff>)</FONT>
    <FONT color=3D#98fb98>or</FONT> <FONT color=3D#ffa500>die</FONT> =
<FONT color=3D#00cd00>"Can't tie $outfile: $!"</FONT><FONT =
color=3D#00ffff>;</FONT>

<FONT color=3D#bebebe># copy (don't use </FONT><FONT =
color=3D#cdcd00>%db_out</FONT><FONT color=3D#bebebe> =3D </FONT><FONT =
color=3D#cdcd00>%db_in</FONT><FONT color=3D#bebebe> because it's slow on =
big databases)
</FONT><FONT color=3D#ffa500>while</FONT> <FONT =
color=3D#00ffff>(</FONT><FONT color=3D#ffa500>my</FONT><FONT =
color=3D#00ffff>(</FONT>$k, $v<FONT color=3D#00ffff>)</FONT> =3D <FONT =
color=3D#ff7f50>each</FONT> <FONT color=3D#cdcd00>%db_in</FONT><FONT =
color=3D#00ffff>)</FONT> <FONT color=3D#00ffff>{</FONT>
    <FONT color=3D#cdcd00>$db_out</FONT><FONT =
color=3D#00ffff>{</FONT>$k<FONT color=3D#00ffff>}</FONT> =3D $v<FONT =
color=3D#00ffff>;</FONT>
<FONT color=3D#00ffff>}</FONT>

<FONT color=3D#bebebe># these unties happen automatically at program =
exit
</FONT><FONT color=3D#ff7f50>untie</FONT> <FONT =
color=3D#cdcd00>%db_in</FONT><FONT color=3D#00ffff>;</FONT>
<FONT color=3D#ff7f50>untie</FONT> <FONT =
color=3D#cdcd00>%db_out</FONT><FONT color=3D#00ffff>;</FONT>

<FONT color=3D#bebebe>#-----------------------------
#% db2gdbm /tmp/users.db /tmp/users.gdbm
#-----------------------------
</FONT></PRE></FONT></TD></TR></TBODY></TABLE></DIV>
<DIV class=3DSECT2>
<H2 class=3DSECT2><A name=3DAEN766>Merging DBM Files</A></H2>
<TABLE width=3D"100%" bgColor=3D#2f4f4f border=3D0>
  <TBODY>
  <TR>
    <TD><PRE class=3DSCREEN><FONT color=3D#f5deb3 size=3D+1><FONT =
color=3D#bebebe>#-----------------------------
</FONT><FONT color=3D#cdcd00>%OUTPUT</FONT> =3D <FONT =
color=3D#00ffff>(</FONT><FONT color=3D#cdcd00>%INPUT1</FONT>, <FONT =
color=3D#cdcd00>%INPUT2</FONT><FONT color=3D#00ffff>);</FONT>
<FONT color=3D#bebebe>#-----------------------------
</FONT><FONT color=3D#cdcd00>%OUTPUT</FONT> =3D <FONT =
color=3D#00ffff>();</FONT>
<FONT color=3D#ffa500>foreach</FONT> <FONT color=3D#9ac0cd>$href</FONT> =
<FONT color=3D#00ffff>(</FONT> \<FONT color=3D#cdcd00>%INPUT1</FONT>, =
\<FONT color=3D#cdcd00>%INPUT2</FONT> <FONT color=3D#00ffff>)</FONT> =
<FONT color=3D#00ffff>{</FONT>
    <FONT color=3D#ffa500>while</FONT> <FONT =
color=3D#00ffff>(</FONT><FONT color=3D#ffa500>my</FONT><FONT =
color=3D#00ffff>(</FONT>$key, $value<FONT color=3D#00ffff>)</FONT> =3D =
<FONT color=3D#ff7f50>each</FONT><FONT =
color=3D#00ffff>(</FONT>%$href<FONT color=3D#00ffff>))</FONT> <FONT =
color=3D#00ffff>{</FONT>
        <FONT color=3D#ffa500>if</FONT> <FONT =
color=3D#00ffff>(</FONT><FONT color=3D#ff7f50>exists</FONT> <FONT =
color=3D#cdcd00>$OUTPUT</FONT><FONT color=3D#00ffff>{</FONT>$key<FONT =
color=3D#00ffff>})</FONT> <FONT color=3D#00ffff>{</FONT>
            <FONT color=3D#bebebe># decide which value to use and set =
</FONT><FONT color=3D#cdcd00>$OUTPUT</FONT><FONT color=3D#bebebe>{$key} =
if necessary
</FONT>        <FONT color=3D#00ffff>}</FONT> <FONT =
color=3D#ffa500>else</FONT> <FONT color=3D#00ffff>{</FONT>
            <FONT color=3D#cdcd00>$OUTPUT</FONT><FONT =
color=3D#00ffff>{</FONT>$key<FONT color=3D#00ffff>}</FONT> =3D =
$value<FONT color=3D#00ffff>;</FONT>
        <FONT color=3D#00ffff>}</FONT>
    <FONT color=3D#00ffff>}</FONT>
<FONT color=3D#00ffff>}</FONT>
<FONT color=3D#bebebe>#-----------------------------
</FONT></PRE></FONT></TD></TR></TBODY></TABLE></DIV>
<DIV class=3DSECT2>
<H2 class=3DSECT2><A name=3DAEN769>Locking DBM Files</A></H2>
<TABLE width=3D"100%" bgColor=3D#2f4f4f border=3D0>
  <TBODY>
  <TR>
    <TD><PRE class=3DSCREEN><FONT color=3D#f5deb3 size=3D+1><FONT =
color=3D#bebebe>#-----------------------------
# <FONT size=3D-1><A =
href=3D"http://pleac.sourceforge.net/include/perl/ch14/dblockdemo">downlo=
ad the following standalone program</A></FONT>
#!/usr/bin/perl
# dblockdemo - demo locking dbm databases
</FONT><FONT color=3D#ffa500>use</FONT> <FONT =
color=3D#b2dfee>DB_File</FONT><FONT color=3D#00ffff>;</FONT>
<FONT color=3D#ffa500>use</FONT> <FONT =
color=3D#b2dfee>strict</FONT><FONT color=3D#00ffff>;</FONT>

<FONT color=3D#ffa500>sub</FONT> <FONT color=3D#b2dfee>LOCK_SH</FONT> =
<FONT color=3D#00ffff>{</FONT> <FONT color=3D#cdcd00>1</FONT> <FONT =
color=3D#00ffff>}</FONT>                   <FONT color=3D#bebebe># In =
case you don't have
</FONT><FONT color=3D#ffa500>sub</FONT> <FONT =
color=3D#b2dfee>LOCK_EX</FONT> <FONT color=3D#00ffff>{</FONT> <FONT =
color=3D#cdcd00>2</FONT> <FONT color=3D#00ffff>}</FONT>                  =
 <FONT color=3D#bebebe># the standard Fcntl module.  You
</FONT><FONT color=3D#ffa500>sub</FONT> <FONT =
color=3D#b2dfee>LOCK_NB</FONT> <FONT color=3D#00ffff>{</FONT> <FONT =
color=3D#cdcd00>4</FONT> <FONT color=3D#00ffff>}</FONT>                  =
 <FONT color=3D#bebebe># should, but who can tell
</FONT><FONT color=3D#ffa500>sub</FONT> <FONT =
color=3D#b2dfee>LOCK_UN</FONT> <FONT color=3D#00ffff>{</FONT> <FONT =
color=3D#cdcd00>8</FONT> <FONT color=3D#00ffff>}</FONT>                  =
 <FONT color=3D#bebebe># how those chips fall?
</FONT>
<FONT color=3D#ffa500>my</FONT><FONT color=3D#00ffff>(</FONT><FONT =
color=3D#9ac0cd>$oldval</FONT>, <FONT color=3D#9ac0cd>$fd</FONT>, <FONT =
color=3D#9ac0cd>$db</FONT>, <FONT color=3D#cdcd00>%db</FONT>, <FONT =
color=3D#9ac0cd>$value</FONT>, <FONT color=3D#9ac0cd>$key</FONT><FONT =
color=3D#00ffff>);</FONT>

$key    =3D <FONT color=3D#ff7f50>shift</FONT> || <FONT =
color=3D#00cd00>'default'</FONT><FONT color=3D#00ffff>;</FONT>
$value  =3D <FONT color=3D#ff7f50>shift</FONT> || <FONT =
color=3D#00cd00>'magic'</FONT><FONT color=3D#00ffff>;</FONT>
$value .=3D <FONT color=3D#00cd00>" $$"</FONT><FONT =
color=3D#00ffff>;</FONT>

$db =3D <FONT color=3D#ff7f50>tie</FONT><FONT =
color=3D#00ffff>(</FONT><FONT color=3D#cdcd00>%db</FONT>, <FONT =
color=3D#00cd00>'DB_File'</FONT>, <FONT =
color=3D#00cd00>'/tmp/foo.db'</FONT>, O_CREAT|O_RDWR, <FONT =
color=3D#cdcd00>0666</FONT><FONT color=3D#00ffff>)</FONT>
    <FONT color=3D#98fb98>or</FONT> <FONT color=3D#ffa500>die</FONT> =
<FONT color=3D#00cd00>"dbcreat /tmp/foo.db $!"</FONT><FONT =
color=3D#00ffff>;</FONT>
$fd =3D $db-&gt;fd<FONT color=3D#00ffff>;</FONT>                      =
<FONT color=3D#bebebe># need this for locking
</FONT><FONT color=3D#ff7f50>print</FONT> <FONT color=3D#00cd00>"$$: db =
fd is $fd\n"</FONT><FONT color=3D#00ffff>;</FONT>
<FONT color=3D#98fb98>open</FONT><FONT color=3D#00ffff>(</FONT>DB_FH, =
<FONT color=3D#00cd00>"+&lt;&amp;=3D$fd"</FONT><FONT =
color=3D#00ffff>)</FONT>
    <FONT color=3D#98fb98>or</FONT> <FONT color=3D#ffa500>die</FONT> =
<FONT color=3D#00cd00>"dup $!"</FONT><FONT color=3D#00ffff>;</FONT>

<FONT color=3D#ffa500>unless</FONT> <FONT color=3D#00ffff>(</FONT><FONT =
color=3D#98fb98>flock</FONT> <FONT color=3D#00ffff>(</FONT>DB_FH, =
LOCK_SH | LOCK_NB<FONT color=3D#00ffff>))</FONT> <FONT =
color=3D#00ffff>{</FONT>
    <FONT color=3D#ff7f50>print</FONT> <FONT color=3D#00cd00>"$$: =
CONTENTION; can't read during write update!
                Waiting for read lock ($!) ...."</FONT><FONT =
color=3D#00ffff>;</FONT>
    <FONT color=3D#ffa500>unless</FONT> <FONT =
color=3D#00ffff>(</FONT><FONT color=3D#98fb98>flock</FONT> <FONT =
color=3D#00ffff>(</FONT>DB_FH, LOCK_SH<FONT color=3D#00ffff>))</FONT> =
<FONT color=3D#00ffff>{</FONT> <FONT color=3D#ffa500>die</FONT> <FONT =
color=3D#00cd00>"flock: $!"</FONT> <FONT color=3D#00ffff>}</FONT>
<FONT color=3D#00ffff>}</FONT>
<FONT color=3D#ff7f50>print</FONT> <FONT color=3D#00cd00>"$$: Read lock =
granted\n"</FONT><FONT color=3D#00ffff>;</FONT>

$oldval =3D <FONT color=3D#cdcd00>$db</FONT><FONT =
color=3D#00ffff>{</FONT>$key<FONT color=3D#00ffff>};</FONT>
<FONT color=3D#ff7f50>print</FONT> <FONT color=3D#00cd00>"$$: Old value =
was $oldval\n"</FONT><FONT color=3D#00ffff>;</FONT>
<FONT color=3D#98fb98>flock</FONT><FONT color=3D#00ffff>(</FONT>DB_FH, =
LOCK_UN<FONT color=3D#00ffff>);</FONT>

<FONT color=3D#ffa500>unless</FONT> <FONT color=3D#00ffff>(</FONT><FONT =
color=3D#98fb98>flock</FONT> <FONT color=3D#00ffff>(</FONT>DB_FH, =
LOCK_EX | LOCK_NB<FONT color=3D#00ffff>))</FONT> <FONT =
color=3D#00ffff>{</FONT>
    <FONT color=3D#ff7f50>print</FONT> <FONT color=3D#00cd00>"$$: =
CONTENTION; must have exclusive lock!
                Waiting for write lock ($!) ...."</FONT><FONT =
color=3D#00ffff>;</FONT>
    <FONT color=3D#ffa500>unless</FONT> <FONT =
color=3D#00ffff>(</FONT><FONT color=3D#98fb98>flock</FONT> <FONT =
color=3D#00ffff>(</FONT>DB_FH, LOCK_EX<FONT color=3D#00ffff>))</FONT> =
<FONT color=3D#00ffff>{</FONT> <FONT color=3D#ffa500>die</FONT> <FONT =
color=3D#00cd00>"flock: $!"</FONT> <FONT color=3D#00ffff>}</FONT>
<FONT color=3D#00ffff>}</FONT>

<FONT color=3D#ff7f50>print</FONT> <FONT color=3D#00cd00>"$$: Write lock =
granted\n"</FONT><FONT color=3D#00ffff>;</FONT>
<FONT color=3D#cdcd00>$db</FONT><FONT color=3D#00ffff>{</FONT>$key<FONT =
color=3D#00ffff>}</FONT> =3D $value<FONT color=3D#00ffff>;</FONT>
$db-&gt;sync<FONT color=3D#00ffff>;</FONT>  <FONT color=3D#bebebe># to =
flush
</FONT><FONT color=3D#98fb98>sleep</FONT> <FONT =
color=3D#cdcd00>10</FONT><FONT color=3D#00ffff>;</FONT>

<FONT color=3D#98fb98>flock</FONT><FONT color=3D#00ffff>(</FONT>DB_FH, =
LOCK_UN<FONT color=3D#00ffff>);</FONT>
<FONT color=3D#ff7f50>undef</FONT> $db<FONT color=3D#00ffff>;</FONT>
<FONT color=3D#ff7f50>untie</FONT> <FONT color=3D#cdcd00>%db</FONT><FONT =
color=3D#00ffff>;</FONT>
<FONT color=3D#98fb98>close</FONT><FONT =
color=3D#00ffff>(</FONT>DB_FH<FONT color=3D#00ffff>);</FONT>
<FONT color=3D#ff7f50>print</FONT> <FONT color=3D#00cd00>"$$: Updated db =
to $key=3D$value\n"</FONT><FONT color=3D#00ffff>;</FONT>

<FONT color=3D#bebebe>#-----------------------------
</FONT></PRE></FONT></TD></TR></TBODY></TABLE></DIV>
<DIV class=3DSECT2>
<H2 class=3DSECT2><A name=3DAEN772>Sorting Large DBM Files</A></H2>
<TABLE width=3D"100%" bgColor=3D#2f4f4f border=3D0>
  <TBODY>
  <TR>
    <TD><PRE class=3DSCREEN><FONT color=3D#f5deb3 size=3D+1><FONT =
color=3D#bebebe>#-----------------------------
</FONT><FONT color=3D#ffa500>use</FONT> <FONT =
color=3D#b2dfee>DB_File</FONT><FONT color=3D#00ffff>;</FONT>

<FONT color=3D#bebebe># specify the Perl sub to do key comparison using =
the
# exported $DB_BTREE hash reference
</FONT>$DB_BTREE-&gt;<FONT color=3D#00ffff>{</FONT><FONT =
color=3D#00cd00>'compare'</FONT><FONT color=3D#00ffff>}</FONT> =3D <FONT =
color=3D#ffa500>sub</FONT> <FONT color=3D#00ffff>{</FONT>
    <FONT color=3D#ffa500>my</FONT> <FONT color=3D#00ffff>(</FONT><FONT =
color=3D#9ac0cd>$key1</FONT>, <FONT color=3D#9ac0cd>$key2</FONT><FONT =
color=3D#00ffff>)</FONT> =3D <FONT color=3D#cdad00>@_</FONT> <FONT =
color=3D#00ffff>;</FONT>
    <FONT color=3D#ffa500>return</FONT> <FONT =
color=3D#00cd00>"\L$key1"</FONT> <FONT color=3D#98fb98>cmp</FONT> <FONT =
color=3D#00cd00>"\L$key2"</FONT><FONT color=3D#00ffff>;</FONT>
<FONT color=3D#00ffff>};</FONT>

<FONT color=3D#ff7f50>tie</FONT><FONT color=3D#00ffff>(</FONT><FONT =
color=3D#cdcd00>%hash</FONT>, <FONT color=3D#00cd00>"DB_File"</FONT>, =
$filename, O_RDWR|O_CREAT, <FONT color=3D#cdcd00>0666</FONT>, =
$DB_BTREE<FONT color=3D#00ffff>)</FONT>
    <FONT color=3D#98fb98>or</FONT> <FONT color=3D#ffa500>die</FONT> =
<FONT color=3D#00cd00>"can't tie $filename: $!"</FONT><FONT =
color=3D#00ffff>;</FONT>
<FONT color=3D#bebebe>#-----------------------------
# <FONT size=3D-1><A =
href=3D"http://pleac.sourceforge.net/include/perl/ch14/sortdemo">download=
 the following standalone program</A></FONT>
#!/usr/bin/perl
# sortdemo - show auto dbm sorting
</FONT><FONT color=3D#ffa500>use</FONT> <FONT =
color=3D#b2dfee>strict</FONT><FONT color=3D#00ffff>;</FONT>
<FONT color=3D#ffa500>use</FONT> <FONT =
color=3D#b2dfee>DB_File</FONT><FONT color=3D#00ffff>;</FONT>

$DB_BTREE-&gt;<FONT color=3D#00ffff>{</FONT><FONT =
color=3D#00cd00>'compare'</FONT><FONT color=3D#00ffff>}</FONT> =3D <FONT =
color=3D#ffa500>sub</FONT> <FONT color=3D#00ffff>{</FONT>
    <FONT color=3D#ffa500>my</FONT> <FONT color=3D#00ffff>(</FONT><FONT =
color=3D#9ac0cd>$key1</FONT>, <FONT color=3D#9ac0cd>$key2</FONT><FONT =
color=3D#00ffff>)</FONT> =3D <FONT color=3D#cdad00>@_</FONT> <FONT =
color=3D#00ffff>;</FONT>
    <FONT color=3D#00cd00>"\L$key1"</FONT> <FONT =

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -