﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Prayer-随笔分类-PERL</title><link>http://www.cppblog.com/prayer/category/12855.html</link><description>在一般中寻求卓越</description><language>zh-cn</language><lastBuildDate>Tue, 08 Jun 2010 03:35:36 GMT</lastBuildDate><pubDate>Tue, 08 Jun 2010 03:35:36 GMT</pubDate><ttl>60</ttl><item><title>shell的效率不如perl或Python? </title><link>http://www.cppblog.com/prayer/archive/2010/06/07/117311.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Mon, 07 Jun 2010 04:25:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2010/06/07/117311.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/117311.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2010/06/07/117311.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/117311.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/117311.html</trackback:ping><description><![CDATA[<div class="postmessage ">
<div class=t_msgfontfix>
<table cellSpacing=0 cellPadding=0>
    <tbody>
        <tr>
            <td class=t_msgfont id=postmessage_12261486>shell文本处理方面，主要是有sed，awk这两把刀。<br><br>光给你个shell你进行文本处理是做不到的，当然简单的还可以。<br><br>perl里有正则表达式引擎，能针对文本进行拆分替换等复杂操作，关键是，perl不用fork出新的进程来处理这些事情，而shell需要使用管道等通过这些sed，awk的进程来处理，至少就多出部分进程的开销。<br><br>而且，管道这个东西，原本一个工具一次能完成的任务，在需要经过sed，和awk等多次管道。效率可想而知。<br><br>其实你这个问题问的有点弱智，SHELL是什么？<br><br>SHELL只是一个接口，大部分的功能全靠外部程序来完成。<br>而Perl是一种语言，基本上什么事情都能做。</td>
        </tr>
    </tbody>
</table>
</div>
</div>
<br><br>老老实实学好一样东西最实际。<br>当你参加面试的时候，如果可以自信的说自己熟练使用Shell或者Perl，那就相当不错了。<br>效率之类的云云，具体问题具体分析吧，能解决工作中遇到的问题就行。<br><br><br>
<div class="postmessage ">
<div class=t_msgfontfix>
<table cellSpacing=0 cellPadding=0>
    <tbody>
        <tr>
            <td class=t_msgfont id=postmessage_12262758>看出来楼主比较关心文本处理，下面这个比方不一定恰当，但已经很接近了：<br><br>
            <ul><br>
                <li>相比较而言，awk、sed就像死板手，而perl和python是个活板手。<br>
                <li>awk和sed专注于文本处理，大部分情况效率要优于perl等。很简单，比如列文件，谁能有cat的效率高？<br>
                <li>如果你是个懒惰的SA，那就用shell吧。如果是geek或者你的工作需要复杂的逻辑，并且还会出现许多无法预知的新要求，那就用perl等好了。<br></li>
            </ul>
            </td>
        </tr>
    </tbody>
</table>
</div>
<div id=post_rate_div_12262758></div>
</div>
<br><br>没那么多关键字，是打字手误，但是1-10万数量级的关键字，在千万行级文本文件中搜索，这个量还是有的。<br><br>来段sed multiple keywords search in batch的代码，欢迎其他新想法。
<div class=blockcode>
<div id=code0>
<ol>
    <li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local num_in_batch=300<br>
    <li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local batch_counter=0<br>
    <li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local log_display_in_batch=1000<br>
    <li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local bbl_counter=0<br>
    <li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local num_in_bl_counter=0<br>
    <li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; declare -a bbl_arr=()<br>
    <li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local keyword=<br>
    <li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local keyword_del<br>
    <li><br>
    <li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>
    <li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; logMsg $debug_flag null "Starting blacklist checking in batch."<br>
    <li><br>
    <li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for msisdn in `cut -d: -f2 $tmpfile`; do&nbsp; &nbsp; &nbsp; &nbsp; <br>
    <li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if [ $batch_counter -eq $num_in_batch ]; then<br>
    <li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; keyword="${keyword}$msisdn"<br>
    <li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bbl_arr=(`sed -rn "/$keyword/p" $filter_file`)<br>
    <li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; local num=${#bbl_arr[@]}<br>
    <li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ((num_in_bl_counter+=num))<br>
    <li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if [ $num -gt 1 ]; then<br>
    <li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; keyword_del=`echo ${bbl_arr[@]} | tr " " "|"`<br>
    <li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sed -ri "/${keyword_del}/d" $inputfile<br>
    <li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fi<br>
    <li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; keyword=<br>
    <li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; batch_counter=0<br>
    <li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else<br>
    <li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; keyword="${keyword}$msisdn|"<br>
    <li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fi<br>
    <li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if [ $((bbl_counter%log_display_in_batch)) -eq 0 ]; then<br>
    <li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; logMsg $debug_flag null "$bbl_counter MSISDN processed."<br>
    <li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fi<br>
    <li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ((batch_counter++))<br>
    <li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ((bbl_counter++))<br>
    <li>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; done</li>
</ol>
</div>
<em onclick="copycode($('code0'));">复制代码</em></div>
<img src ="http://www.cppblog.com/prayer/aggbug/117311.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2010-06-07 12:25 <a href="http://www.cppblog.com/prayer/archive/2010/06/07/117311.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Activeperl windows下所有版本官方下载地址</title><link>http://www.cppblog.com/prayer/archive/2010/01/29/106748.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Fri, 29 Jan 2010 09:32:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2010/01/29/106748.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/106748.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2010/01/29/106748.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/106748.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/106748.html</trackback:ping><description><![CDATA[<h4 class=beTitle id=subjcns!d63c7ee5d2464c26!177>Activeperl windows下所有版本官方下载地址</h4>
<div class=bvMsg id=msgcns!d63c7ee5d2464c26!177>
<div>
<div>Activeperl windows下所有版本官方下载地址：</div>
<div><a href="http://downloads.activestate.com/ActivePerl/Windows/"><u><font color=#810081>http://downloads.activestate.com/ActivePerl/Windows/</font></u></a><a href="http://downloads.activestate.com/ActivePerl/Windows/"></a></div>
<div>&nbsp;</div>
<div><a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/?C=N;O=D"><u><font color=#0000ff>Name</font></u></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/?C=M;O=A"><u><font color=#0000ff>Last modified</font></u></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/?C=S;O=A"><u><font color=#0000ff>Size</font></u></a>&nbsp; <a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/?C=D;O=A"><u><font color=#0000ff>Description</font></u></a><u><font color=#0000ff></font></u></div>
<div>
<hr>
</div>
<div><a href="http://somosky.spaces.live.com/ActivePerl/"><u><font color=#0000ff>Parent Directory</font></u></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&nbsp;&nbsp;&nbsp;<br><a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/5.005/"><u><font color=#0000ff>5.005/</font></u></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 01-Aug-2007 23:17&nbsp;&nbsp;&nbsp; -&nbsp;&nbsp; <br><a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/5.6/"><u><font color=#0000ff>5.6/</font></u></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 01-Aug-2007 23:17&nbsp;&nbsp;&nbsp; -&nbsp;&nbsp; <br><a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/5.8/"><u><font color=#0000ff>5.8/</font></u></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 01-Aug-2007 23:17&nbsp;&nbsp;&nbsp; -&nbsp;&nbsp; </div>
<div>&nbsp;</div>
<div>
<h1>Index of /ActivePerl/Windows/5.6</h1>
<pre><a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/?C=N;O=D"><u><font color=#0000ff>Name</font></u></a>                                                     <a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/?C=M;O=A"><u><font color=#0000ff>Last modified</font></u></a>      <a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/?C=S;O=A"><u><font color=#0000ff>Size</font></u></a>  <a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/?C=D;O=A"><u><font color=#0000ff>Description</font></u></a><u><font color=#0000ff><hr></font></u> <a href="http://somosky.spaces.live.com/ActivePerl/Windows/"><u><font color=#0000ff>Parent Directory</font></u></a>                                                              -
<a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/unsupported/"><u><font color=#0000ff>unsupported/</font></u></a>                                             01-Aug-2007 23:17    -
<a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/ActivePerl-5.6.0.611.msi"><u><font color=#0000ff>ActivePerl-5.6.0.611.msi</font></u></a>                                 17-Mar-2000 22:29  7.8M
<a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/ActivePerl-5.6.0.613.msi"><u><font color=#0000ff>ActivePerl-5.6.0.613.msi</font></u></a>                                 28-Mar-2000 19:48  8.0M
<a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/ActivePerl-5.6.0.615-MSWin32-x86-multi-thread.msi"><u><font color=#0000ff>ActivePerl-5.6.0.615-MSWin32-x86-multi-thread.msi</font></u></a>        06-Jul-2000 17:00  8.2M
<a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/ActivePerl-5.6.0.616-MSWin32-x86-multi-thread.msi"><u><font color=#0000ff>ActivePerl-5.6.0.616-MSWin32-x86-multi-thread.msi</font></u></a>        14-Jul-2000 22:20  7.9M
<a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/ActivePerl-5.6.0.617-MSWin32-x86-multi-thread.msi"><u><font color=#0000ff>ActivePerl-5.6.0.617-MSWin32-x86-multi-thread.msi</font></u></a>        01-Sep-2000 02:57  8.2M
<a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/ActivePerl-5.6.0.618-MSWin32-x86-multi-thread.msi"><u><font color=#0000ff>ActivePerl-5.6.0.618-MSWin32-x86-multi-thread.msi</font></u></a>        14-Sep-2000 03:27  8.3M
<a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/ActivePerl-5.6.0.620-MSWin32-x86-multi-thread.msi"><u><font color=#0000ff>ActivePerl-5.6.0.620-MSWin32-x86-multi-thread.msi</font></u></a>        01-Nov-2000 03:18  8.2M
<a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/ActivePerl-5.6.0.623-MSWin32-x86-multi-thread.msi"><u><font color=#0000ff>ActivePerl-5.6.0.623-MSWin32-x86-multi-thread.msi</font></u></a>        16-Dec-2000 00:38  7.3M
<a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/ActivePerl-5.6.0.623-MSWin32-x86-multi-thread.zip"><u><font color=#0000ff>ActivePerl-5.6.0.623-MSWin32-x86-multi-thread.zip</font></u></a>        16-Dec-2000 03:55  7.9M
<a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/ActivePerl-5.6.1.624-TRIAL2-MSWin32-x86-multi-thread.msi"><u><font color=#0000ff>ActivePerl-5.6.1.624-TRIAL2-MSWin32-x86-multi-thread.msi</font></u></a> 06-Feb-2001 21:17  7.5M
<a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/ActivePerl-5.6.1.624-TRIAL2-MSWin32-x86-multi-thread.zip"><u><font color=#0000ff>ActivePerl-5.6.1.624-TRIAL2-MSWin32-x86-multi-thread.zip</font></u></a> 06-Feb-2001 21:18  7.9M
<a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/ActivePerl-5.6.1.625-TRIAL3-MSWin32-x86-multi-thread.msi"><u><font color=#0000ff>ActivePerl-5.6.1.625-TRIAL3-MSWin32-x86-multi-thread.msi</font></u></a> 23-Mar-2001 06:06  7.7M
<a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/ActivePerl-5.6.1.625-TRIAL3-MSWin32-x86-multi-thread.zip"><u><font color=#0000ff>ActivePerl-5.6.1.625-TRIAL3-MSWin32-x86-multi-thread.zip</font></u></a> 23-Mar-2001 06:06  8.1M
<a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/ActivePerl-5.6.1.626-MSWin32-x86-multi-thread.msi"><u><font color=#0000ff>ActivePerl-5.6.1.626-MSWin32-x86-multi-thread.msi</font></u></a>        02-May-2001 22:35  7.9M
<a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/ActivePerl-5.6.1.626-MSWin32-x86-multi-thread.zip"><u><font color=#0000ff>ActivePerl-5.6.1.626-MSWin32-x86-multi-thread.zip</font></u></a>        02-May-2001 22:37  8.4M
<a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/ActivePerl-5.6.1.628-MSWin32-x86-multi-thread.msi"><u><font color=#0000ff>ActivePerl-5.6.1.628-MSWin32-x86-multi-thread.msi</font></u></a>        05-Jul-2001 19:02  8.0M
<a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/ActivePerl-5.6.1.628-MSWin32-x86-multi-thread.zip"><u><font color=#0000ff>ActivePerl-5.6.1.628-MSWin32-x86-multi-thread.zip</font></u></a>        05-Jul-2001 19:02  8.5M
<a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/ActivePerl-5.6.1.629-MSWin32-x86-multi-thread.msi"><u><font color=#0000ff>ActivePerl-5.6.1.629-MSWin32-x86-multi-thread.msi</font></u></a>        24-Aug-2001 15:40  7.9M
<a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/ActivePerl-5.6.1.629-MSWin32-x86-multi-thread.zip"><u><font color=#0000ff>ActivePerl-5.6.1.629-MSWin32-x86-multi-thread.zip</font></u></a>        24-Aug-2001 15:45  8.5M
<a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/ActivePerl-5.6.1.630-MSWin32-x86.msi"><u><font color=#0000ff>ActivePerl-5.6.1.630-MSWin32-x86.msi</font></u></a>                     01-Nov-2001 04:41   12M
<a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/ActivePerl-5.6.1.630-MSWin32-x86.zip"><u><font color=#0000ff>ActivePerl-5.6.1.630-MSWin32-x86.zip</font></u></a>                     01-Nov-2001 04:42   12M
<a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/ActivePerl-5.6.1.631-MSWin32-x86.msi"><u><font color=#0000ff>ActivePerl-5.6.1.631-MSWin32-x86.msi</font></u></a>                     03-Jan-2002 01:38  8.1M
<a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/ActivePerl-5.6.1.631-MSWin32-x86.zip"><u><font color=#0000ff>ActivePerl-5.6.1.631-MSWin32-x86.zip</font></u></a>                     03-Jan-2002 01:39  8.0M
<a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/ActivePerl-5.6.1.632-MSWin32-x86-bad.msi"><u><font color=#0000ff>ActivePerl-5.6.1.632-MSWin32-x86-bad.msi</font></u></a>                 03-Jun-2002 23:23  8.5M
<a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/ActivePerl-5.6.1.632-MSWin32-x86.msi"><u><font color=#0000ff>ActivePerl-5.6.1.632-MSWin32-x86.msi</font></u></a>                     10-Jun-2002 22:38  8.5M
<a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/ActivePerl-5.6.1.632-MSWin32-x86.zip"><u><font color=#0000ff>ActivePerl-5.6.1.632-MSWin32-x86.zip</font></u></a>                     03-Jun-2002 23:23  8.4M
<a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/ActivePerl-5.6.1.633-MSWin32-x86.msi"><u><font color=#0000ff>ActivePerl-5.6.1.633-MSWin32-x86.msi</font></u></a>                     20-Jun-2002 17:26  8.6M
<a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/ActivePerl-5.6.1.633-MSWin32-x86.zip"><u><font color=#0000ff>ActivePerl-5.6.1.633-MSWin32-x86.zip</font></u></a>                     20-Jun-2002 17:26  8.4M
<a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/ActivePerl-5.6.1.635-MSWin32-x86-symbols.zip"><u><font color=#0000ff>ActivePerl-5.6.1.635-MSWin32-x86-symbols.zip</font></u></a>             04-Feb-2003 23:53  4.5M
<a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/ActivePerl-5.6.1.635-MSWin32-x86.msi"><u><font color=#0000ff>ActivePerl-5.6.1.635-MSWin32-x86.msi</font></u></a>                     06-Feb-2003 05:48  8.4M
<a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/ActivePerl-5.6.1.635-MSWin32-x86.zip"><u><font color=#0000ff>ActivePerl-5.6.1.635-MSWin32-x86.zip</font></u></a>                     10-Feb-2003 21:30  8.3M
<a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/ActivePerl-5.6.1.638-MSWin32-x86-symbols.zip"><u><font color=#0000ff>ActivePerl-5.6.1.638-MSWin32-x86-symbols.zip</font></u></a>             16-Apr-2004 19:54  4.5M
<a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/ActivePerl-5.6.1.638-MSWin32-x86.msi"><u><font color=#0000ff>ActivePerl-5.6.1.638-MSWin32-x86.msi</font></u></a>                     16-Apr-2004 19:53  8.5M
<a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/ActivePerl-5.6.1.638-MSWin32-x86.zip"><u><font color=#0000ff>ActivePerl-5.6.1.638-MSWin32-x86.zip</font></u></a>                     16-Apr-2004 19:54  8.3M
<a href="http://somosky.spaces.live.com/mmm2007-10-25_18.59/MD5SUM"><u><font color=#0000ff>MD5SUM</font></u></a>                                                   01-Aug-2007 23:17  2.6K  </pre>
</div>
</div>
</div>
<img src ="http://www.cppblog.com/prayer/aggbug/106748.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2010-01-29 17:32 <a href="http://www.cppblog.com/prayer/archive/2010/01/29/106748.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>perl语言简介</title><link>http://www.cppblog.com/prayer/archive/2010/01/25/106400.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Mon, 25 Jan 2010 08:23:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2010/01/25/106400.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/106400.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2010/01/25/106400.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/106400.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/106400.html</trackback:ping><description><![CDATA[<table style="TABLE-LAYOUT: fixed; WIDTH: 100%">
    <tbody>
        <tr>
            <td>
            <div class=cnt id=blog_text>
            <p style="TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 18pt">P</span><span style="FONT-SIZE: 12pt">erl</span><span style="FONT-SIZE: 12pt">是什么东西呢<span>? </span>它是<span>Practical Extraction Report Language</span>等字的缩写，是一种能扫视任意文字文件，并且能从中取出信息制成报表的解译语言<span>(Interpreter)</span>。如果你懂<span>UNIX</span>的话，它的目 的就是用来取代<span>UNIX</span>原有的<span>sed</span>、<span>awk</span>与<span>shell script</span>的组合，用来汇集信息、产生报表的一个工具语言<span>(</span>程序<span>)</span>。<span>Perl</span>的作者是<span>Larry Wall &lt;lwall@netlabs.com&gt;</span>。他曾经贡献过好几个很有用的<span>Public Domain</span>程序给大家使用，包括<span>patch</span>和<span>rn</span>。他设计<span>Perl</span>时的哲学是以实用为第一优先<span>(</span>所谓的实用就是语言容易使用、有效率，而且完整<span>)</span>，而不 是设计一个看起来很漂亮的语言<span>(</span>漂亮就是程序非常的小，语法幽雅，而且只由最少的语法基本元素构成<span>)</span>，所以只要你学上手了，你就会深深的喜欢上<span>Perl</span>的 实用性和方便性。 <span></span></span></p>
            <p style="TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 18pt">P</span><span style="FONT-SIZE: 12pt">erl</span><span style="FONT-SIZE: 12pt">包含了<span>C</span>、<span>sed</span>、<span>awk</span>和<span>sh</span>这几个工具最好的特色，而且主要的语法很接近<span>C</span>语言，对原本熟悉<span>C</span>语言的人来说非常容易上手。就我个人的经验，除了<span>C</span>以外，如果能再懂<span>shell script</span>的语法是最好不过了，因为<span>Perl</span>中一些符号的使用和<span>shell script</span>是一致的。当然如果又懂得<span>awk</span>和<span>sed</span>那就更好了。<span>Larry Wall</span>说过一句话：「<span>Perl</span>是懒人用的工具」<span>(</span>于我心有戚戚焉<span>^_^)</span>。如果<span>Perl</span>不是比其它语言更好更简单更容易上手，恐怕很少人愿意去学习新的程序语言。 <span></span></span></p>
            <p style="TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 18pt">正</span><span style="FONT-SIZE: 12pt">由于<span>Perl</span>的特性，容易处理字符串参数的传递，自然成了某些特殊用途的新宠，尤其是<span>CGI</span>，彷佛<span>Perl</span>天生是为了<span>CGI</span>而设计的<span>! </span>事实上<span>CGI</span>本身定义是和使用的程序语言种类无关的，你可以用<span>C</span>、<span>Fortran</span>、甚至<span>Visual Basic</span>、<span>Delphi</span>来写<span>CGI</span>程序。那为什么大家现在都采用<span>Perl</span>呢<span>? </span>原因有下面几点： <span></span></span></p>
            <ul type=disc>
                <li style="TEXT-ALIGN: left"><span style="FONT-SIZE: 12pt">⊙Perl</span><span style="FONT-SIZE: 12pt">有非常杰出的文字处理能力，能轻易地产生<span>HTML</span>檔，尤其它具有完整的<span>Regular Expression</span>语法，使得在<span>C</span>语言看来必需要写一大串程序代码的功能，<span>Perl</span>几行就解决了。 <span></span></span>
                <li style="TEXT-ALIGN: left"><span style="FONT-SIZE: 12pt">⊙Perl</span><span style="FONT-SIZE: 12pt">是一种直译式语言，因此可以避免在各种不同系统上，还需要重新编译的麻烦。 <span></span></span>
                <li style="TEXT-ALIGN: left"><span style="FONT-SIZE: 12pt">⊙Perl</span><span style="FONT-SIZE: 12pt">的检查旗标<span>(-T)</span>可以保护你的<span>Web Server</span>，避免被未经授权的<span>client</span>破坏。 <span></span></span></li>
            </ul>
            <p style="MARGIN-BOTTOM: 12pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt"></span></p>
            <p style="TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 18pt">一</span><span style="FONT-SIZE: 12pt">个语言的好坏，我想我们可以从三个方向来看：数据型态<span>(data type)</span>、流程控制叙述<span>(control statements)</span>、特殊功能。 <span></span></span></p>
            <ul type=disc>
                <li style="TEXT-ALIGN: left"><span style="FONT-SIZE: 12pt">１<span>.Perl</span>的数据型态跟<span>C</span>语言和<span>Pascal</span>不大一样，但它也支持指标<span>(pointer</span>，<span>Perl5</span>以后才支持<span>)</span>，所以也可以和<span>C</span>语言一样组合出很复杂的数据结构<span>(data structure)</span>。特别的是<span>Perl</span>有一种新的<span>data type</span>：相关数组，它和一般数组没什么不同，差别只在它的索引值是用字符串，而非一般常用的整数值，因此相关数组不像一般数组一样有次序的概念，它没有所谓的第一项数据这种说法。我个人认为如果能善用这种<span>data type</span>会带给你意想不到的收获哦。<span></span></span>
                <li style="TEXT-ALIGN: left"><span style="FONT-SIZE: 12pt">２<span>.Perl</span>的条件控制叙述<span>(conditional control statements)</span>与循环控制叙述<span>(loop control statements)</span>几乎和<span>C</span>语言一模一样，甚至语法和一些常用的指令也和<span>C</span>语言很类似，这对一般使用者而言是很方便的，可以很快的让使用者进入状况， 进一步了解<span>Perl</span>的精华。而在<span>Perl5</span>中又引进了模块化和区域变量<span>(local variables)</span>的观念，大大的增强了<span>Perl</span>的能力，使<span>Perl</span>几乎变得无所不能。 <span></span></span>
                <li style="TEXT-ALIGN: left"><span style="FONT-SIZE: 12pt">３<span>.Perl</span>处理字符串的能力是众所皆知的，除了它的纯量变量<span>(scalar variable)</span>可以很轻易的存取字符串，特别的是<span>Perl</span>提供和<span>UNIX</span>很相近的<span>Regular Expressions</span>语法，这种格式辨认<span>(pattern-matching)</span>的语法很复杂但十分强大，大大地增强了<span>Perl</span>处理字符串的能力，要善用<span>Perl</span>处理字符串的能力，就得先对<span>Regular Expressions</span>痛下一番功夫不可。这个东东实在不好懂，不过只要你用上了手，真的是如虎添翼，每次使用时都会为它强大的功能窃喜，反而觉得<span>C</span>平淡无奇。另外<span>Perl</span>有一堆特殊的全域变量<span>(global variables)</span>，用来设定程序的执行环境和其它细节，可能小到数组索引的起始值，大到输出字段的分隔符号都有影响。这么多的特殊变量对大多数的人而言是只是个困扰，但是我建议若要深入了解<span>Perl</span>、善用<span>Perl</span>，最好多了解这些特殊变量的意义。 <span></span></span></li>
            </ul>
            <p style="TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 18pt">说</span><span style="FONT-SIZE: 12pt">了这么多<span>Perl</span>的优点，其实<span>Perl</span>也是有缺点的，最令人垢病的就是执行速度。由于<span> Perl</span>是直译式的程序语言<span>(Interpreter)</span>，不需要事先经过编译<span>(compile)</span>，这一点在发展程序初期很有用，程序写好了就可以直接 <span>run</span>了，但缺点是程序执行的速度会变慢，不利于发展大程序或系统程序。不过<span>Perl</span>对上述一般解译语言的缺点做了一点改良，它在执行时会先加载整个程序 码，并执行初步的<span>compile</span>，包括语法检查和建立符号表，因此<span>Perl</span>比一般<span>script</span>语言安全而且快多了。但是就我观察所得，<span>Perl</span>有一些设计 实在很浪费内存和<span>CPU</span>，似乎<span>Perl</span>并不很在意内存和速度，而是以实用性和方便性为优先考虑。其实由于硬件技术的进步，对现在来说，内存和<span>CPU </span>速度已经不是那么令人在意，反而程序的安全性和亲和性才是考虑的重点，像<span>Microsoft WORD</span>这只大怪兽一样，所以对速度要求比较多的玩家，也只有请你多多忍耐了。 <span></span></span></p>
            <p style="TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 18pt">总</span><span style="FONT-SIZE: 12pt">而言之，<span>Perl</span>的优点多多，尤其是它优异的处理字符串能力，更使它异军突起，成为<span>CGI</span>程序的新宠，这也是为什么<span>Perl</span>会流行起来的主要原因。 <span></span></span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.cppblog.com/prayer/aggbug/106400.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2010-01-25 16:23 <a href="http://www.cppblog.com/prayer/archive/2010/01/25/106400.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>python简介</title><link>http://www.cppblog.com/prayer/archive/2010/01/25/106399.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Mon, 25 Jan 2010 08:21:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2010/01/25/106399.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/106399.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2010/01/25/106399.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/106399.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/106399.html</trackback:ping><description><![CDATA[<table style="TABLE-LAYOUT: fixed; WIDTH: 100%">
    <tbody>
        <tr>
            <td>
            <div class=cnt id=blog_text>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt; COLOR: black">&#8220;Python&#8221;</span><span style="FONT-SIZE: 12pt; COLOR: black">这个英文单词的发音似</span><span style="FONT-SIZE: 12pt; COLOR: black">&#8220;</span><span style="FONT-SIZE: 12pt; COLOR: black">派森</span><span style="FONT-SIZE: 12pt; COLOR: black">&#8221;</span><span style="FONT-SIZE: 12pt; COLOR: black">，因此中文可以称之为派森。</span><span style="FONT-SIZE: 12pt; COLOR: black">Python</span><span style="FONT-SIZE: 12pt; COLOR: black">是一个有</span><span style="FONT-SIZE: 12pt; COLOR: black">10</span><span style="FONT-SIZE: 12pt; COLOR: black">年历史的</span><span style="FONT-SIZE: 12pt; COLOR: black">Windows</span><span style="FONT-SIZE: 12pt; COLOR: black">编程语言。</span><span style="FONT-SIZE: 12pt; COLOR: black">Python</span><span style="FONT-SIZE: 12pt; COLOR: black">的创始人为</span><span style="FONT-SIZE: 12pt; COLOR: black">Guido van Rossum</span><span style="FONT-SIZE: 12pt; COLOR: black">。</span></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt; COLOR: black"></span><span style="FONT-SIZE: 12pt; COLOR: black"></span></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt; COLOR: black">Python</span><span style="FONT-SIZE: 12pt; COLOR: black">是一种即译式的，互动的，面向对象的编程语言，它包含了模组式的操作，异常处理，动态资料形态，十分高层次的动态资料结构，以及类别的使用。</span><span style="FONT-SIZE: 12pt; COLOR: black">Python</span><span style="FONT-SIZE: 12pt; COLOR: black">揉 合了简单的语法和强大的功能。它的语法表达优美易读。它具有很多优秀的脚本语言的特点：解释的，面向对象的，内建的高级数据结构，支持模块和包，支持多种 平台，可扩展。而且它还支持交互式方式运行，图形方式运行。它拥有众多的编程界面支持各种操作系统平台以及众多的各类函数库。利用</span><span style="FONT-SIZE: 12pt; COLOR: black">C</span><span style="FONT-SIZE: 12pt; COLOR: black">和</span><span style="FONT-SIZE: 12pt; COLOR: black">C++</span><span style="FONT-SIZE: 12pt; COLOR: black">可以对它进行扩充。个别的应用软件如果需要有一个可程序化界面也可以利用它来做为扩展语言用。最后，</span><span style="FONT-SIZE: 12pt; COLOR: black">Python</span><span style="FONT-SIZE: 12pt; COLOR: black">的可移植度非常高</span><span style="FONT-SIZE: 12pt; COLOR: black">:</span><span style="FONT-SIZE: 12pt; COLOR: black">它可以在许多的</span><span style="FONT-SIZE: 12pt; COLOR: black">Unix</span><span style="FONT-SIZE: 12pt; COLOR: black">类平台上运行，在</span><span style="FONT-SIZE: 12pt; COLOR: black">Mac,MS-DOS,</span><span style="FONT-SIZE: 12pt; COLOR: black">视窗</span><span style="FONT-SIZE: 12pt; COLOR: black">Windows</span><span style="FONT-SIZE: 12pt; COLOR: black">，</span><span style="FONT-SIZE: 12pt; COLOR: black">Windows NT</span><span style="FONT-SIZE: 12pt; COLOR: black">，</span><span style="FONT-SIZE: 12pt; COLOR: black">OS/2</span><span style="FONT-SIZE: 12pt; COLOR: black">，</span><span style="FONT-SIZE: 12pt; COLOR: black">BeOS</span><span style="FONT-SIZE: 12pt; COLOR: black">，以至</span><span style="FONT-SIZE: 12pt; COLOR: black">RISCOS</span><span style="FONT-SIZE: 12pt; COLOR: black">上都有相关的</span><span style="FONT-SIZE: 12pt; COLOR: black">Python</span><span style="FONT-SIZE: 12pt; COLOR: black">版本。</span></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt; COLOR: black"></span><span style="FONT-SIZE: 12pt; COLOR: black"></span></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt; COLOR: black">Python</span><span style="FONT-SIZE: 12pt; COLOR: black">核心网站是</span><span style="FONT-SIZE: 12pt; COLOR: black">: <a href="http://www.python.org/"><font color=#000000><u>http://www.python.org/</u></font></a> </span><span style="FONT-SIZE: 12pt; COLOR: black">，其中你可以找到很多资料。如果您第一次使用</span><span style="FONT-SIZE: 12pt; COLOR: black"> Python, </span><span style="FONT-SIZE: 12pt; COLOR: black">可以下载一个试试。目前，</span><span style="FONT-SIZE: 12pt; COLOR: black">Python</span><span style="FONT-SIZE: 12pt; COLOR: black">已经有成百上千的公共资源可以供你调用。</span><span style="FONT-SIZE: 12pt; COLOR: black"> </span></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt; COLOR: black"></span><span style="FONT-SIZE: 12pt; COLOR: black"></span></p>
            <p style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%; TEXT-ALIGN: left" align=left><strong><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%">Python</span></strong><strong><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%">作用</span></strong><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%"> </span></p>
            <p style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%"></span></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt; COLOR: black">Python</span><span style="FONT-SIZE: 12pt; COLOR: black">可以用在许多场合。当你需要大量的动态调整，要容易使用，功能强大并且富有弹性的情况，</span><span style="FONT-SIZE: 12pt; COLOR: black">Python</span><span style="FONT-SIZE: 12pt; COLOR: black">可以发挥很好的功效。</span><span style="FONT-SIZE: 12pt"> </span></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt"></span></p>
            <p style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%; TEXT-ALIGN: left" align=left><strong><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%">一个宏编程语言</span></strong><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%"> </span></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt">你可以用<span>Python</span>给现有的应用程序添加一个宏语言或底稿编制（<span>scripting</span>）能力。经过稍微的训练，它使用户级别的底稿编制变得简单。发展一种新的语言常常被认为是大公司独家专利。<span>Python</span>是一个你可以加入你现有工具的宏语言并适合不同的层次的人使用。<span></span></span></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt"></span></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><strong><span style="FONT-SIZE: 12pt">一个快速的对象模型和算法的原型开发工具</span></strong><span style="FONT-SIZE: 12pt"> </span></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt">开发软件花费钱财需要很多时间才能达到很好的效果。在<span>Python</span>下创建对象，你可以比我们知道的任何语言用更短的代码和更少的时间，并且全部支持继承，密封和多形性。一个比较流行的办法是在<span>Python</span>中原型一个程序，直到你相信设计是正确的再换到<span>C++</span>中，一个更好的办法是将<span>Python</span>应用程序轮廓化，然后在<span>C++</span>中重写速度至关重要的部分。<span></span></span></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt"><br><br></span><strong><span style="FONT-SIZE: 12pt">一个调试工具</span></strong><span style="FONT-SIZE: 12pt"> </span></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt">新程序和代码库需要测试。有经验的开发人员知道给一个新功能或程序建立一个测试套件会节约时间并减少麻烦。如果一个程序可以与输入输出文件工作，<span>Python </span>可以生成输入，运行这个程序，然后检查输出并进行分析。如果问题在于数据，你可以编写一次性的脚本来检查数据是否一致。<span></span></span></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt"></span></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><strong><span style="FONT-SIZE: 12pt">数据清除和转换</span></strong><span style="FONT-SIZE: 12pt"></span></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt">你可能会将数据由一个数据库移到一个新的数据库，或新建一个界面让数据在互不兼容的系统中流动。如果人工来做，这会是一个很繁琐而且容易犯错误的过程，你总会遗漏东西，到头来你还得重做以前的工作。<span>Python</span>对列表和字典的本地支持使复杂的数据转换更加容易。而且这种交互式模式可以让编程人员在转换过程的每一阶段观看数据。还可以编写由源到目标的数据转换的脚本并按需要不断运行，直到它正确完成工作。<span></span></span></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt"></span></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><strong><span style="FONT-SIZE: 12pt">Python</span></strong><strong><span style="FONT-SIZE: 12pt">作为粘合剂</span></strong><span style="FONT-SIZE: 12pt"> </span></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt">互不兼容的系统常常需要被联在一起，而且这个过程需要自动进行。<span>Python</span>支持所有的集成关键技术。同时也很好的与文件，协议，<span>DLLs</span>及<span>COM</span>对象工作。<span>Python</span>还提供广泛的库帮助你得到几乎任何种类的数据。它还是很好的控制其他套件、进行系统管理以及控制其他系统数据流动的工具。<span></span></span></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt"></span></p>
            <p style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%; TEXT-ALIGN: left" align=left><strong><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%">运行方式</span></strong></p>
            <p style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%; TEXT-ALIGN: left" align=left><strong><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%"></span></strong><strong><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%"></span></strong></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt">Python</span><span style="FONT-SIZE: 12pt">可以以命令行方式运行，也可以交互式方式运行，还具有图形集成环境，这样开发<span>Python</span>就相当方便。现在已经出现了许多用<span>Python</span>编写的可视化编程软件，用于实现象<span>Delphi</span>一样的功能。<span></span></span></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt; COLOR: black"></span></p>
            <p style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%; TEXT-ALIGN: left" align=left><strong><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%">面向对象</span></strong></p>
            <p style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%; TEXT-ALIGN: left" align=left><strong><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%"><span></span></span></strong></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt">Python</span><span style="FONT-SIZE: 12pt">是一个真正的面向对象语言。它甚至支持异常的处理。如果学过<span>Java</span>，应该对这个不陌生。但其它的脚本语言，如<span>PHP</span>，好象就没有。这使得程序的编写更加清晰，而不需要许多的错误检查了。<span></span></span></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24pt; LINE-HEIGHT: 150%; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%"></span></p>
            <p style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%; TEXT-ALIGN: left" align=left><strong><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%">模块和包</span></strong></p>
            <p style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%; TEXT-ALIGN: left" align=left><strong><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%"><span></span></span></strong></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt">这一点更象是<span>Java</span>。对于<span>Java</span>的支持，大家可以了解<span>JPython</span>。<span>JPython</span>是用<span>Java</span>写的<span>Python</span>，它完全支持<span>Java</span>，在这个环境下使用<span>Python</span>可以随意地使用<span>Java</span>的类库。语言扩展可以用<span>C</span>、<span>C++</span>或<span>Java</span>为<span>Python</span>编写新的新言模块，如函数。或者与<span>Python</span>直接编译在一起，或者采用动态库装入方式实现。也专门有人编写了一个工具，可以实现为<span>Python</span>自动实现函数接口封装，这就是<span>SWIG</span>（<span>Simplified Wrapper and Interface Generator)</span>，或称做简单封装和接口生成器<span>(</span>可以在<span><a href="http://sourceforge.net/projects/swig/"><span style="COLOR: windowtext; TEXT-DECORATION: none">http://sourceforge.net/projects/swig/</span></a>)</span>。<span></span></span></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt"></span></p>
            <p style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%; TEXT-ALIGN: left" align=left><strong><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%">有趣的语法</span></strong><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%"> </span></p>
            <p style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%"></span></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt">Guido</span><span style="FONT-SIZE: 12pt">认为<span>Python</span>的语法是非常优美的。其中一点就是，块语句的表示不是<span>C</span>语言常用的<span>{}</span>对，或其它符号对，而是采用缩近表示法！有趣吧。就这一点来说，<span>Guido</span>的解释是：首先，使用缩近表示法减少了视觉上的混乱，并且使程序变短，这样就减少了需要对基本代码单元注意的范围；其次，它减少了程序员的自由度，更有利于统一风格，使得阅读别人的程序更容易。感觉还是不错的，就<span>C</span>语言来说，在<span>if</span>语句后面大括号的写法就好几种，不同的人喜欢不同的样子，还不如统一起来，都不会看得别扭。</span><span style="FONT-SIZE: 12pt; COLOR: black"> </span></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt; COLOR: black">在每个类或函数的定义后面，第一行可以是说明语句，根本不需要注释符标记。对于后面跟块语句的语句，后面应跟上一个冒号。一行语句不能太长，因为没有行结束符，如果超长则要使用续行符</span><span style="FONT-SIZE: 12pt; COLOR: black">(\)</span><span style="FONT-SIZE: 12pt; COLOR: black">。还有一些有趣的比如说，象下面的一个比较处理，用</span><span style="FONT-SIZE: 12pt; COLOR: black">C</span><span style="FONT-SIZE: 12pt; COLOR: black">语言为：</span><span style="FONT-SIZE: 12pt; COLOR: black"><span>&nbsp;&nbsp;&nbsp;</span></span></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt; COLOR: black"><span></span></span></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt; COLOR: black">if (2</span></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt; COLOR: black">用</span><span style="FONT-SIZE: 12pt; COLOR: black">Python</span><span style="FONT-SIZE: 12pt; COLOR: black">可以表示为</span><span style="FONT-SIZE: 12pt; COLOR: black"></span></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt; COLOR: black">if (2<a>&lt;&gt;</a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a> </a></span></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt; COLOR: black"></span><a></a></p>
            <p style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%; TEXT-ALIGN: left" align=left><a><strong><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%">什么是<span>Zope?</span></span></strong><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%"> </span></a></p>
            <p style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%"></span><a></a></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt; COLOR: black"><a>Zope</a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>是一个开放源代码的</a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>Web</a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>应用服务器，采用</a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>Python</a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>语言开发，使用它您可以方便的构建内容管理、内部网、门户网站、和其他的定制应用。</a></span></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt; COLOR: black"></span><span style="FONT-SIZE: 12pt; COLOR: black"></span><a></a></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt; COLOR: black"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>高度面向对象的</a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>Web</a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>开发平台</a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>,</a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>采用</a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>Python</a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>语言开发。</a></span><span style="FONT-SIZE: 12pt; COLOR: black"></span></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt; COLOR: black"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>可以运行在几乎所有流行的操作系统上</a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>,</a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>支持多语言。</a></span><span style="FONT-SIZE: 12pt; COLOR: black"></span></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt; COLOR: black"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>能集成到其他流行的服务器，也自带服务器。</a></span><span style="FONT-SIZE: 12pt; COLOR: black"></span></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt; COLOR: black"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>提供清晰的数据</a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>/</a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>逻辑</a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>/</a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>表示的分离。</a></span><span style="FONT-SIZE: 12pt; COLOR: black"></span></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt; COLOR: black"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>带有可扩展的内置对象和强大的集成安全模块。</a></span></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt; COLOR: black"></span><span style="FONT-SIZE: 12pt; COLOR: black"></span><a></a></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt; COLOR: black"><a></a></span><a><strong><span style="FONT-SIZE: 12pt; COLOR: black">什么是<span>Plone?</span></span></strong></a></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><a><strong><span style="FONT-SIZE: 12pt; COLOR: black"><span></span></span></strong><strong><span style="FONT-SIZE: 12pt; COLOR: black"></span></strong></a></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt; COLOR: black"><a>Pone</a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>是一个</a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>Zope</a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>上的一个用户友好、功能强大的开放源代码内容管理系统。</a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>Plone</a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>适合用作内部网</a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>/</a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>外部网的服务器、文档发布系统、门户服务器和异地协同群件工具，到目前，</a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>Plone</a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>其实已经发展成为了一个应用开发平台。</a></span></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt; COLOR: black"></span><span style="FONT-SIZE: 12pt; COLOR: black"></span><a></a></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt; COLOR: black"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>是一种功能强大的开放源码</a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>(Open Source)</a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>内容管理系统</a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>(CMS)</a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>。</a></span><span style="FONT-SIZE: 12pt; COLOR: black"></span></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt; COLOR: black"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>通过</a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>Web</a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>浏览器来访问、编辑内容和管理</a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>,</a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>易于更新内容。</a></span><span style="FONT-SIZE: 12pt; COLOR: black"></span></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt; COLOR: black"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>无需编程，即可创建新的内容类型。</a></span><span style="FONT-SIZE: 12pt; COLOR: black"></span></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt; COLOR: black"><a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>协同的编辑和发布机制。</a></span></p>
            <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt; COLOR: black"></span><span style="FONT-SIZE: 12pt; COLOR: black"></span><a></a></p>
            <p style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%; TEXT-ALIGN: left" align=left><a><strong><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%">Python</span></strong><strong><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%">的<span>IDE</span>开发环境<span>:</span></span></strong><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%"> </span></a></p>
            <p style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%; TEXT-ALIGN: left" align=left><a><strong><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%"></span></strong></a></p>
            <p style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%; TEXT-ALIGN: left" align=left><a><strong><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%">Wingide</span></strong><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%">:</span></a><a href="http://www.wingide.com/"><span style="COLOR: rgb(102,102,102); TEXT-DECORATION: none">http:// www.wingide.com</span></a><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%"></span></p>
            <p style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%; TEXT-ALIGN: left" align=left><strong><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%">ipython</span></strong><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%">: <a href="http://ipython.scipy.org/"><span style="COLOR: rgb(102,102,102); TEXT-DECORATION: none">http://ipython.scipy.org/</span></a> </span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<br>
<img src ="http://www.cppblog.com/prayer/aggbug/106399.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2010-01-25 16:21 <a href="http://www.cppblog.com/prayer/archive/2010/01/25/106399.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows下使用Perl连接DB2</title><link>http://www.cppblog.com/prayer/archive/2010/01/25/106374.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Mon, 25 Jan 2010 03:17:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2010/01/25/106374.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/106374.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2010/01/25/106374.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/106374.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/106374.html</trackback:ping><description><![CDATA[本文是参考了&lt;DB2&nbsp;Magazine&nbsp;Quarter&nbsp;1.&nbsp;2005.&nbsp;VOLUME&nbsp;10&nbsp;NUMBER&nbsp;1&gt;;杂志里的&lt;Perls&nbsp;of&nbsp;Wisdom-Follow&nbsp;these&nbsp;simple&nbsp;steps&nbsp;to&nbsp;use&nbsp;the&nbsp;free&nbsp;Perl&nbsp;language&nbsp;with&nbsp;DB2&gt;;一文，可以说是一个摘抄（不同的是文章是中文） <br>原文参见http://www.db2mag.com/story/showArticle.jhtml?articleID=59301551 <br><br>1.&nbsp;Perl的DB2驱动 <br>Perl语言本身就不多做介绍了。 <br>1994年发布的DBI是Perl语言连接关系性数据库的标准。可以从dbi.perl.org获得DBI的源代码和文档。 <br>IBM在1995年发布了对于Perl的DB2驱动，这个驱动是符合DBI标准的，在Perl里这个驱动称为DBD::DB2&nbsp;。可以从ibm.com/software/db2/perl获得DBD::DB2驱动的最新信息。 <br><br>注意：最近的DB2驱动需要至少Perl&nbsp;5.005_03和DBI&nbsp;1.21或以上的版本。 <br><br>2.&nbsp;准备环境 <br>步骤如下 <br>(1)安装Perl语言环境 <br>Windows下可以从www.activestate.com获得Perl的安装包。 <br>安装后可以使用perl&nbsp;-v看看Perl的版本信息。 <br>DBI驱动和DBD::DB2驱动都是作为Perl的附加模块使用ppm工具安装的。安装方法参见(2),&nbsp;(3)，安装时最好先去ibm.com/software/db2/perl上看看ppm后面的参数有没有变化。 <br><br>(2)安装DBI驱动 <br>ppm&nbsp;install&nbsp;http://ftp.esoftmatic.com/outgoing/DBI/5.8.4/DBI.ppd <br><br>(3)安装DBD::DB2驱动 <br>ppm&nbsp;install&nbsp;http://ftp.esoftmatic.com/outgoing/DBI/5.8.4/DBD-DB2.ppd <br><br>(4)安装DB2&nbsp;runtime&nbsp;client <br><br><br>3.&nbsp;使用Perl连接DB2 <br>(1)使用DBI函数DBI-&gt;;data_sources&nbsp;来扫描DB2数据库目录并返回一个包含了有效数据源名称(DSN)的数组。 <br>----------------datasources.pl------------- <br>#!/usr/lib/perl&nbsp;-w <br># <br>#&nbsp;This&nbsp;perl&nbsp;script&nbsp;prints&nbsp;the&nbsp;list&nbsp;of&nbsp;cataloged&nbsp;DB2&nbsp;data-sources <br># <br>use&nbsp;DBI; <br>use&nbsp;DBD::DB2; <br>use&nbsp;DBD::DB2::Constants; <br><br>print&nbsp;"Operating&nbsp;Systems&nbsp;=&nbsp;$^O\n"; <br>print&nbsp;"Perl&nbsp;Binary&nbsp;=&nbsp;$^X\n"; <br>print&nbsp;"Perl&nbsp;Version&nbsp;=&nbsp;$]\n"; <br>print&nbsp;"DBI&nbsp;Version&nbsp;=&nbsp;$DBI::VERSION\n"; <br>print&nbsp;"DBD::DB2&nbsp;Version&nbsp;=&nbsp;$DBD::DB2::VERSION\n\n"; <br><br>my&nbsp;@DB2DataSources&nbsp;=&nbsp;DBI-&gt;;data_sources("DB2"); <br><br>print&nbsp;"Available&nbsp;DB2&nbsp;DSNs:\n\n"; <br><br>foreach&nbsp;my&nbsp;$dsn&nbsp;(&nbsp;@DB2DataSources&nbsp;) <br>{ <br>print&nbsp;"&nbsp;$dsn&nbsp;\n"; <br>} <br>-------------------END---------------------- <br><br>(2)获取db2数据库的信息 <br>----------datasourceInfo.pl-------------------------- <br>#!/usr/lib/perl&nbsp;-w <br># <br>#&nbsp;This&nbsp;perl&nbsp;script&nbsp;prints&nbsp;the&nbsp;information&nbsp;DB2&nbsp;database <br># <br>use&nbsp;DBI; <br>use&nbsp;DBD::DB2; <br>use&nbsp;DBD::DB2::Constants; <br><br>my&nbsp;$dsn&nbsp;=&nbsp;'dbi:DB2:SAMPLE'; <br>my&nbsp;$uid&nbsp;=&nbsp;'henry'; <br>my&nbsp;$pwd&nbsp;=&nbsp;'happyday'; <br><br>my&nbsp;$dbh&nbsp;=&nbsp;DBI-&gt;;connect(&nbsp;$dsn,&nbsp;$uid,&nbsp;$pwd&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||&nbsp;die&nbsp;"$DBI::errstr"; <br><br>print&nbsp;"Database&nbsp;Connection&nbsp;Information&nbsp;\n\n"; <br>printf(&nbsp;"Server&nbsp;Instance&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;%s\n",&nbsp;$dbh-&gt;;get_info(&nbsp;SQL_SERVER_NAME&nbsp;)&nbsp;); <br>printf(&nbsp;"Database&nbsp;Server&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;%s\n",&nbsp;$dbh-&gt;;get_info(&nbsp;SQL_DBMS_NAME&nbsp;)&nbsp;); <br>printf(&nbsp;"Database&nbsp;Version&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;%s\n",&nbsp;$dbh-&gt;;get_info(&nbsp;SQL_DBMS_VER&nbsp;)&nbsp;);&nbsp;&nbsp; <br>printf(&nbsp;"Database&nbsp;Alias&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;%s\n",&nbsp;$dbh-&gt;;get_info(&nbsp;SQL_DATA_SOURCE_NAME&nbsp;)&nbsp;); <br>printf(&nbsp;"Database&nbsp;Codepage&nbsp;&nbsp;&nbsp;:&nbsp;%s\n",&nbsp;$dbh-&gt;;get_info(&nbsp;2519&nbsp;)&nbsp;); <br>printf(&nbsp;"Application&nbsp;Codepage:&nbsp;%s\n",&nbsp;$dbh-&gt;;get_info(&nbsp;2520&nbsp;)&nbsp;); <br>printf(&nbsp;"Authoriztion&nbsp;Id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;%s\n",&nbsp;$dbh-&gt;;get_info(&nbsp;SQL_USER_NAME&nbsp;)&nbsp;); <br>printf(&nbsp;"Max&nbsp;Idntifier&nbsp;Len&nbsp;&nbsp;&nbsp;:&nbsp;%s\n",&nbsp;$dbh-&gt;;get_info(&nbsp;SQL_MAX_IDENTIFIER_LEN&nbsp;)&nbsp;); <br>printf(&nbsp;"Max&nbsp;Table&nbsp;Name&nbsp;Len&nbsp;&nbsp;:&nbsp;%s\n",&nbsp;$dbh-&gt;;get_info(&nbsp;SQL_MAX_TABLE_NAME_LEN&nbsp;)&nbsp;); <br>printf(&nbsp;"Max&nbsp;Index&nbsp;Size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;%s\n",&nbsp;$dbh-&gt;;get_info(&nbsp;SQL_MAX_INDEX_SIZE&nbsp;)&nbsp;); <br>printf(&nbsp;"Max&nbsp;Columns&nbsp;in&nbsp;Table:&nbsp;%s\n",&nbsp;$dbh-&gt;;get_info(&nbsp;SQL_MAX_COLUMNS_IN_TABLE&nbsp;)&nbsp;); <br>-------------------END---------------------- <br><br>(3)获取db2数据库的元数据(比如,&nbsp;表结构) <br>----------tableinfo.pl-------------------------- <br>#!/usr/lib/perl&nbsp;-w <br># <br>#&nbsp;This&nbsp;perl&nbsp;script&nbsp;prints&nbsp;the&nbsp;information&nbsp;of&nbsp;cataloged&nbsp;DB2&nbsp;table <br># <br>use&nbsp;DBI; <br>use&nbsp;DBD::DB2; <br>use&nbsp;DBD::DB2::Constants; <br><br>$dsn&nbsp;=&nbsp;'dbi:DB2:SAMPLE'; <br>$uid&nbsp;=&nbsp;'henry'; <br>$pwd&nbsp;=&nbsp;'happyday'; <br><br>#&nbsp;Connect&nbsp;to&nbsp;the&nbsp;SAMPLE&nbsp;database <br>$dbh&nbsp;=&nbsp;DBI-&gt;;connect(&nbsp;$dsn,&nbsp;$uid,&nbsp;$pwd&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||&nbsp;die&nbsp;"$DBI::errstr"; <br><br>#&nbsp;Get&nbsp;the&nbsp;tables&nbsp;for&nbsp;schema&nbsp;HENRY <br>$sth&nbsp;=&nbsp;$dbh-&gt;;table_info(&nbsp;{&nbsp;'TABLE_CSHEM'&nbsp;=&gt;;&nbsp;"HENRY"&nbsp;}&nbsp;); <br><br>$table_counter&nbsp;=&nbsp;0; <br>while&nbsp;(&nbsp;@row&nbsp;=&nbsp;$sth-&gt;;fetchrow_array&nbsp;) <br>{ <br>$catalog&nbsp;=&nbsp;$row[0]; <br>$schema&nbsp;=&nbsp;$row[1]; <br>$table&nbsp;=&nbsp;$row[2]; <br><br>$table_counter++; <br>printf(&nbsp;"Table&nbsp;%d&nbsp;%s\n",&nbsp;$table_counter,&nbsp;$table&nbsp;); <br><br>#&nbsp;Now&nbsp;get&nbsp;the&nbsp;column&nbsp;information&nbsp;for&nbsp;this&nbsp;table <br>$sth_col&nbsp;=&nbsp;$dbh-&gt;;column_info(&nbsp;$catalog,&nbsp;$schema,&nbsp;$table,&nbsp;'%'&nbsp;); <br>if(&nbsp;$sth_col&nbsp;) <br>{ <br>while(&nbsp;@row_col&nbsp;=&nbsp;$sth_col-&gt;;fetchrow_array&nbsp;) <br>{ <br>#&nbsp;@row_col&nbsp;has&nbsp;a&nbsp;lot&nbsp;more&nbsp;information.&nbsp;I'll&nbsp;just&nbsp;take <br>#&nbsp;these&nbsp;three&nbsp;fields&nbsp;as&nbsp;an&nbsp;example <br>$column_name&nbsp;=&nbsp;$row_col[3]; <br>$type_name&nbsp;&nbsp;&nbsp;=&nbsp;$row_col[5]; <br>$column_size&nbsp;=&nbsp;$row_col[6]; <br><br>printf(&nbsp;"&nbsp;&nbsp;%-24s%s(%s)\n",&nbsp;$column_name,&nbsp;$type_name,&nbsp;$column_size&nbsp;); <br>} <br><br>$sth_col-&gt;;finish(); <br>} <br>} <br><br>$sth-&gt;;finish(); <br>$dbh-&gt;;disconnect; <br>-------------------END---------------------- <br><br>(4)执行SQL <br>----------executesql.pl-------------------------- <br>#!/usr/lib/perl&nbsp;-w <br># <br>#&nbsp;This&nbsp;perl&nbsp;script&nbsp;manipulate&nbsp;DB2&nbsp;table <br># <br>use&nbsp;DBI; <br>use&nbsp;DBD::DB2; <br>use&nbsp;DBD::DB2::Constants; <br><br>$dsn&nbsp;=&nbsp;'dbi:DB2:SAMPLE'; <br>$uid&nbsp;=&nbsp;'henry'; <br>$pwd&nbsp;=&nbsp;'happyday'; <br><br>#&nbsp;Connect&nbsp;to&nbsp;the&nbsp;SAMPLE&nbsp;database <br>$dbh&nbsp;=&nbsp;DBI-&gt;;connect(&nbsp;$dsn,&nbsp;$uid,&nbsp;$pwd&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||&nbsp;die&nbsp;"$DBI::errstr"; <br><br>#&nbsp;Prepare&nbsp;our&nbsp;insert&nbsp;statement <br>$sth&nbsp;=&nbsp;$dbh-&gt;;prepare(&nbsp;"INSERT&nbsp;INTO&nbsp;sales&nbsp;VALUES('2005-06-25',&nbsp;'Tom',&nbsp;'Beijing',&nbsp;15)"); <br>$sth-&gt;;execute(); <br>$sth-&gt;;finish(); <br>$dbh-&gt;;disconnect; <br>-------------------END----------------------<br>
<img src ="http://www.cppblog.com/prayer/aggbug/106374.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2010-01-25 11:17 <a href="http://www.cppblog.com/prayer/archive/2010/01/25/106374.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>通过Perl 编程访问DB2数据库 </title><link>http://www.cppblog.com/prayer/archive/2010/01/21/106114.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Thu, 21 Jan 2010 03:34:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2010/01/21/106114.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/106114.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2010/01/21/106114.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/106114.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/106114.html</trackback:ping><description><![CDATA[<blockquote>在本文中，我们将学习如何编写简单的 Perl 程序来提取或操作 IBM&#174; DB2&#174; Universal Database&#8482;（DB2 UDB）中存储的数据。我们将从一个简单的任务入手：从数据库中选择一行数据放入一个 Perl 程序中；接着逐步介绍一些高级主题，包括处理大对象和调用存储过程。</blockquote><!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--end RESERVED FOR FUTURE USE INCLUDE FILES-->
<p><a name=IDAIDYCC><span class=atitle>简介</span></a></p>
<p>Perl（Practical Extraction and Report Language）是一种功能强大而又非常简单易用的编程语言，在很多操作系统上都可以使用。Perl 是免费的。我们可以（以源代码或二进制的格式）下载这个语言，并可以免费地使用它。</p>
<p>Perl 日渐成为一种广受欢迎的语言。它包含了 C 编程语言的特性，以及 UNIX&#174; 中的一些命令，例如 <code>awk</code> 和 <code>sed</code>。Perl 是一种解释语言，可以在单独的应用程序中使用，也可以与 Apache 一起来构建 Web 应用程序。</p>
<p>我们可以使用 Perl 快速操作来自文件或 RDBMS 的大型数据集。DBI 是在 Perl 脚本中连接 RDBMS 的标准，它是在 1994 年开始引入的。在 <a href="http://dbi.perl.org/">http://dbi.perl.org/</a> 站点上可以找到 DBI 驱动程序的源代码及其文档。</p>
<p>IBM 在 1992 年为 Perl 开发了 DB2 的驱动程序，并随着 DBI 规范的发展周期性地对其进行更新。这个驱动程序的最新版本（在撰写本文时）是 0.78。在 <a href="http://www-306.ibm.com/software/data/db2/perl/">http://www.ibm.com/software/data/db2/perl/</a> 上可以找到主要的 DBD::DB2（这是 Perl 语言中采用的命名机制）驱动程序信息。</p>
<p>本文将展示如何编写简单的 Perl 程序来提取或操作 DB2 UDB 中存储的数据。我们将从一个简单的任务入手：从数据库中选择一行数据放入一个 Perl 程序中；接着逐步介绍一些高级主题，包括处理大对象和调用存储过程。</p>
<p><a name=IDAIEYCC><span class=atitle>开始</span></a></p>
<p><a href="http://www-128.ibm.com/developerworks/cn/db2/library/techarticles/dm-0512greenstein/index.html#fig1">图 1</a> 展示了 Perl 环境如何与数据库环境进行交互：</p>
<br><a name=fig1><strong>图 1. Perl 环境 </strong></a><br><img height=106 alt="Perl 环境" src="http://linux.chinaunix.net/mirror/www-128.ibm.com/developerworks/cn/db2/library/techarticles/dm-0512greenstein/fig1.gif" width=422><br>
<p>正如可以从这个图中看出的，Perl 程序使用了一个标准的 API 来与 DBI（Perl 的数据库接口模块）进行通信。Perl DBI 模块只能支持动态 SQL。它定义了一组方法、变量和约定来提供一个与实际使用的数据库独立的一致数据库接口。DBI 为 API 提供了一个一致的接口，它可以适用于程序员想使用的任何数据库。DBD::DB2 是一个 Perl 模块，当与 DBI 一起使用时，它就可以让 Perl 与 DB2 UDB 进行通信。</p>
<p>因此，为了运行访问 DB2 数据库的 Perl 脚本，需要在系统上安装以下组件：</p>
<ul>
    <li>Perl 语言环境
    <li>DBI 驱动程序（可以用于任何 RDBMS）
    <li>DBD::DB2 驱动程序
    <li>DB2 Runtime Client
    <li>C 编译器
    <li>DB2 数据库服务器的连接信息</li>
</ul>
<p>在 <a href="http://www.ibm.com/software/db2/perl/">http://www.ibm.com/software/db2/perl/</a> 的 Web 站点上可以看到所有的安装配置指南。</p>
<p><a name=IDANFYCC><span class=atitle>连接到 DB2 数据库上</span></a></p>
<p>为了让 Perl 程序访问 DB2 数据库，需要建立到数据库的连接。为了让 Perl 加载 DBI 模块，需要在 Perl DB2 应用程序中包含下面的内容：</p>
<p><code>use DBI;</code></p>
<p>当使用 <code>DBI-&gt;connect</code> 语句（语法如下）来创建一个<em>数据库句柄</em> 时，DBI 模块会自动加载 DBD::DB2 驱动程序。</p>
<br><a name=listing1><strong>清单 1. 创建数据库句柄</strong></a><br>
<table cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
    <tbody>
        <tr>
            <td>
            <pre><code class=section>
            use DBI;
            $dbh = DBI-&gt;connect (&#8220;dbi:DB2:dbalias", $UserId, $password);
            </code></pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>其中：</p>
<table cellSpacing=0 cellPadding=0 border=0>
    <tbody>
        <tr>
            <td>$dbh</td>
            <td>—— 表示 connect 语句所返回的数据库句柄</td>
        </tr>
        <tr>
            <td>dbalias</td>
            <td>—— 表示分类进 DB2 数据库目录中的 DB2 别名</td>
        </tr>
        <tr>
            <td>$userID</td>
            <td>—— 表示用来连接数据库的用户 ID </td>
        </tr>
        <tr>
            <td>$password</td>
            <td>—— 表示这个用户 ID 的密码</td>
        </tr>
    </tbody>
</table>
<p>清单 2 展示了一个简单的 Perl 程序，它建立到数据库 SAMPLE 的连接，并返回今天的日期。这个程序执行一条动态生成的 DB2 SQL 语句，从数据库中获取 CURRENT DATE。它使用 DBI -&gt; bind_col 方法将数据库中的值传递到一个本地变量中，稍后我们就会讨论这个问题。</p>
<br><a name=listing2><strong>清单 2. 连接到数据库上并执行语句</strong></a><br>
<table cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
    <tbody>
        <tr>
            <td>
            <pre><code class=section>
            #!/usr/local/bin/perl -w
            use DBI;
            use strict;
            # Open a connection
            my $dbh = DBI-&gt;connect("dbi:DB2:sample", &#8220;DB2ADMIN", &#8220;db2admin&#8220;, {RaiseError =&gt; 1});
            # use VALUES to retrieve value from special register
            my $stmt = "Values CURRENT DATE";
            my $sth = $dbh-&gt;prepare($stmt);
            $sth-&gt;execute();
            # associate variables with output columns...
            my $col1;
            $sth-&gt;bind_col(1,\$col1);
            while ($sth-&gt;fetch) { print "Today is: $col1\n"; }
            $sth-&gt;finish();
            $dbh-&gt;disconnect();
            </code></pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p><a name=IDAGHYCC><span class=atitle>错误处理 —— SQLCODE 和 SQLSTATE</span></a></p>
<p>为了返回与某个 Perl DBI 数据库句柄或语句句柄相关的 SQLSTATE，可以调用 <em>state</em> 方法。例如，要返回与数据库句柄 $dbhandle 相关的 SQLSTATE ，可以在应用程序中使用下面的 Perl 语句：</p>
<p><code>my $sqlstate = $dbhandle-&gt;state;</code></p>
<p>为了返回与某个 Perl DBI 数据库句柄或语句句柄相关的 SQLCODE，可以调用 <em>err</em> 方法。例如，要返回与数据库句柄 $dbhandle 相关的 SQLCODE，可以在应用程序中使用下面的 Perl 语句：</p>
<p><code>my $sqlcode = $dbhandle-&gt;err;</code></p>
<p><em>errstr</em> 方法返回与某个 Perl DBI 数据库句柄或语句句柄相关的 SQLCODE 的消息。我推荐使用这个方法，因为这个方法可以给出有关 SQL 语句失败的更多信息。</p>
<p>清单 3 中的例子展示了这个方法的用法：</p>
<br><a name=listing3><strong>清单 3. 返回错误消息的 errstr 方法</strong></a><br>
<table cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
    <tbody>
        <tr>
            <td>
            <pre><code class=section>
            $dbh = DBI-&gt;connect("dbi:DB2:sample",&#8220;USERID",&#8220;password") or
            die &#8220;Can't connect to sample database: $DBI::errstr";
            $sth = $dbh-&gt;prepare(&#8220;SQL statement&#8220;) or   die "Cannot prepare: " $dbh-&gt;errstr;
            $sth-&gt;&gt;execute() or   die "Cannot execute: " $sth-&gt;errstr;
            </code></pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>现在让我们进一步看一下第一个实验。它展示了一个 Perl 程序，这个程序使用作为参数传入的用户 ID 和密码来连接数据库 SAMPLE。当传递了有效的 ID 和密码时，它会返回一条消息说明连接成功了。下面是 lab1.pl 的代码：</p>
<br><a name=listing4><strong>清单 4. lab1.pl</strong></a><br>
<table cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
    <tbody>
        <tr>
            <td>
            <pre><code class=section>
            #!/usr/local/bin/perl &#8211;w
            use DBI;
            $db2user = $ARGV[0];
            $pasw = $ARGV[1];
            # Open a connection
            $dbh = DBI-&gt;connect("dbi:DB2:sample", $db2user, $pasw)  or
            &#8220;Can't connect to sample database: $DBI::errstr";
            print "Connection is successful !!\n";
            </code></pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>图 2 给出了使用有效身份验证和无效身份验证来执行这个程序的结果：</p>
<br><a name=fig2><strong>图 2. 执行 lab1.pl</strong></a><br><img height=182 alt="执行 lab1.pl" src="http://linux.chinaunix.net/mirror/www-128.ibm.com/developerworks/cn/db2/library/techarticles/dm-0512greenstein/fig2.gif" width=572><br>
<p>&#160;</p>
<p><a name=IDAFRSJE><span class=atitle>执行 SQL 语句</span></a></p>
<p>下面让我们来编写一个程序，在数据库 SAMPLE 中创建一个表 PT_ADDR_BOOK。要执行在编写应用程序时就已经知道的 SQL 语句，可以使用 <code>$dbh-&gt;do</code> 方法。这个方法的语法如下所示：</p>
<p><code>my $cnt = $dbh-&gt;do(SQL statement);</code></p>
<p>其中 <code>$cnt</code> 是这条 SQL 语句所影响的行数。</p>
<p>使用这个方法，我们的程序创建了一个 DB2 表，如清单 5 所示：</p>
<br><a name=listing5><strong>清单 5. 用来创建 DB2 表的程序</strong></a><br>
<table cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
    <tbody>
        <tr>
            <td>
            <pre><code class=section>
            #!/usr/local/bin/perl -w
            use DBI;
            use DBD::DB2::Constants;
            $dbh = DBI-&gt;connect("dbi:DB2:sample","","") or
            die &#8220;Can't connect to sample database: $DBI::errstr";
            $rcount = <span class=boldcode>$dbh-&gt;do</span> (&#8220;CREATE TABLE PT_addr_book(name char(30),
            phone char(10))");
            print &#8220;Returns: $rcount\n";
            </code></pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>可以使用相同的 <code>do</code> 方法向 PT_addr_book 表中插入几行数据。请注意，所插入行的值在编写这个程序时都是已知的，因此可以硬编码在代码中。</p>
<br><a name=listing6><strong>清单 6. 使用 do 方法插入几行数据</strong></a><br>
<table cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
    <tbody>
        <tr>
            <td>
            <pre><code class=section>
            #!/usr/local/bin/perl -w
            use DBI;
            use DBD::DB2::Constants;
            $dbh = DBI-&gt;connect("dbi:DB2:sample","","") or
            die "Can't connect to sample database: $DBI::errstr";
            $rcount = <span class=boldcode>$dbh-&gt; do</span> ("Insert into PT_ADDR_BOOK values
            ('Gregory Whales','9142712020'),
            ('Robert Moses', 2127652345')");
            print "Returns: $rcount \n";
            </code></pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>正如从这个例子中可以看到的，这条 SQL 语句会影响两行数据。通过在 DB2 CLP 中对这个表运行 SELECT 语句，可以确定有两行数据已经插入了这个表中。</p>
<br><a name=listing7><strong>清单 7. test_do_exs.pl</strong></a><br>
<table cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
    <tbody>
        <tr>
            <td>
            <pre><code class=section>
            $perl test_do_exs.pl
            Returns : 2
            $db2 &#8220;select * from PT_ADDR_BOOK"
            NAME                               PHONE
            ------------------------------ ----------
            Gregory Whales                 9142712020
            Robert Moses                   2127652345
            2 record(s) selected.
            </code></pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>下面让我们从 下载 一节中实验 2 的练习开始，编写并执行一个简单的 Perl 程序来更新 PR_ADDR_BOOK 表。</p>
<p><a name=IDAFTSJE><span class=atitle>INSERT、UPDATE 和 DELETE 语句 —— 没有占位符</span></a></p>
<p>执行一条在编写应用程序时还未确定的 SQL 语句（动态 SQL）需要使用一种不同的技术，可以使用 <code>$dbh-&gt;prepare</code> 方法来实现。动态 SQL 可以通过在程序执行过程中自己修改列、表和谓词（操作）的能力来实现。动态 SQL 需要由 UDB 优化器来<em>准备</em> 执行，目的是为这条语句创建一个访问计划。如果动态 SQL 没有参数标记（占位符），它就可以在这个步骤之后立即执行。清单 8 给出了 <code>$dbh-&gt;prepare</code> 和 <code>$sth-&gt;execute</code> 方法的语法，可以在 Perl 程序中用来执行没有占位符的嵌入式 SQL 语句： </p>
<br><a name=listing8><strong>清单 8. 动态 SQL 的准备和执行</strong></a><br>
<table cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
    <tbody>
        <tr>
            <td>
            <pre><code class=section>
            $stmt = &#8220;SQL Statement without placeholder&#8220;;
            $sth = $dbh-&gt;prepare($stmt);
            $sth-&gt;execute();
            </code></pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>请注意，<code>$dbh-&gt;prepare</code> 方法的结果是 SQL 语句句柄。</p>
<p>清单 9 中给出的 Perl 程序展示了如何使用这些方法将一行数据插入到 PT_ADDR_BOOK 表中：</p>
<br><a name=listing9><strong>清单 9. 插入一行数据</strong></a><br>
<table cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
    <tbody>
        <tr>
            <td>
            <pre><code class=section>
            #!/usr/local/bin/perl -w
            use DBI;
            use DBD::DB2::Constants;
            $dbh = DBI-&gt;connect("dbi:DB2:sample","","") or
            die &#8220;Can't connect to sample database: $DBI::errstr";
            $stmt = "INSERT INTO PT_addr_book values ('JOHN SMITH','9145556677')&#8220;;
            $sth = <span class=boldcode>$dbh-&gt;prepare</span>($stmt);
            <span class=boldcode>$sth-&gt;execute();</span>
            print "We inserted row into addr_book\n";
            $sth-&gt;finish();
            </code></pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p><a name=IDA4USJE><span class=atitle>具有参数标记的 SQL 语句</span></a></p>
<p>现在让我们来看一下如何执行在编写应用程序时还不确定并且具有参数标记（即占位符）的 SQL 语句 —— 即真正的动态 SQL 语句。请注意，我们推荐使用这种 SQL 语句，因为它们具有性能和安全性方面的优点。从性能的角度来看，动态 SQL 语句只需要准备一次就可以执行多次，可以重用相同的数据库访问计划。从安全性的角度来看，占位符可以确保只有一个值可以插入到这条语句中，从而可以避免出现 SQL 语句错误。</p>
<p>为了让 Perl 程序将动态 SQL 语句转换成可执行的格式，需要首先使用 <em>prepare</em> 方法，然后使用 <em>bind_param</em> 方法来绑定参数。只有这样才可以执行这条语句。要绑定每个参数，需要指定参数标记的个数，以及包含这些参数标记值的本地 Perl 变量的名字。清单 10 给出了让 Perl 程序执行动态 SQL 语句所使用的方法的语法：</p>
<br><a name=listing10><strong>清单 10. 动态 SQL 的方法</strong></a><br>
<table cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
    <tbody>
        <tr>
            <td>
            <pre><code class=section>
            $stmt = &#8220;SQL Statement with parameter marker&#8220;;
            $sth = $dbh-&gt;prepare($stmt);
            $sth-&gt;bind_param(1,$parm,\% attr);
            $sth-&gt;execute();
            </code></pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>清单 11 展示了对表 PT_ADDR_BOOK 执行 INSERT 操作的方法。现在，所插入列的值不再是在 SQL 语句中硬编码的了，而是使用参数标记动态传递给这条语句的；这些参数标记已经使用 <strong>$sth-&gt;bind_param</strong> 方法与这条语句进行了绑定。只有完成这些设置之后，才开始执行这条语句。</p>
<br><a name=listing11><strong>清单 11. 对表 PT_ADDR_BOOK 执行 INSERT 操作</strong></a><br>
<table cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
    <tbody>
        <tr>
            <td>
            <pre><code class=section>
            #!/usr/local/bin/perl -w
            use DBI;
            use DBD::DB2::Constants;
            $dbh = DBI-&gt;connect("dbi:DB2:sample","","") or
            die &#8220;Can't connect to sample database :DBI::errstr";
            $name ="STEVE BROWN";
            $phone = "7184358769";
            $stmt = "INSERT INTO PT_addr_book values (?,?)";
            $sth = $dbh-&gt;prepare($stmt);
            $sth-&gt;bind_param(1,$name);
            $sth-&gt;bind_param(2,$phone);
            $sth-&gt;execute();
            print "We inserted row into addr_book\n";
            $sth-&gt;finish();
            </code></pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p><a name=IDAGWSJE><span class=atitle>从数据库中检索数据 —— 单个结果</span></a></p>
<p>为了将数据库中的值放到 Perl 程序中使用，需要按照下面的步骤执行：</p>
<ol>
    <li>准备 SELECT 语句。
    <li>执行所准备的语句。
    <li>使用 <strong>$sth-&gt;bind_col</strong> 方法把某列的值（或函数）关联到一个本地 Perl 变量上。
    <li>使用 <strong>$sth-&gt;fetch</strong> 方法将一个值取到本地变量中。</li>
</ol>
<p>下面的伪码展示了如何从数据库中检索单个值：</p>
<br><a name=listing12><strong>清单 12. 从数据库中检索单个值</strong></a><br>
<table cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
    <tbody>
        <tr>
            <td>
            <pre><code class=section>
            $stmt = &#8220;SQL SELECT Statement to be executed&#8220;;
            $sth = $dbh-&gt;prepare($stmt);
            $sth-&gt;execute();
            $result = $sth-&gt;bind_col(col, \variable [, \%attr ]);
            while ($sth-&gt;fetch){
            process result of the fetch;
            }
            </code></pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>下面这个例子展示了如何为一个聚合函数 <code>max</code> 从 EMPLOYEE 表中检索 salary 的值：</p>
<br><a name=listing13><strong>清单 13. 为聚合函数检索值</strong></a><br>
<table cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
    <tbody>
        <tr>
            <td>
            <pre><code class=section>
            #!/usr/local/bin/perl -w
            use DBI;
            use DBD::DB2::Constants;
            $dbh = DBI-&gt;connect("dbi:DB2:sample","","") or
            die &#8220;Can't connect to sample database: $DBI::errstr";
            $stmt = "SELECT max(salary) from EMPLOYEE";
            $sth = $dbh-&gt;prepare($stmt);
            $sth-&gt;execute();
            #associate variable with output columns...
            $sth-&gt;bind_col(1,\$max_sal);
            while ($sth-&gt;fetch) {
            print "The biggest salary is: $max_sal\n";
            }
            </code></pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>下面是执行这个 Perl 程序后的结果：</p>
<br><a name=listing14><strong>清单 14. 聚合结果值</strong></a><br>
<table cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
    <tbody>
        <tr>
            <td>
            <pre><code class=section>
            $perl test_return_value.pl
            The biggest salary is: 52750.00
            </code></pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p><a name=IDAYXSJE><span class=atitle>从数据库中检索数据 —— 多个结果</span></a></p>
<p>从数据库中返回一个结果集（即多个结果）到 Perl 程序中的技术与前面所采用的技术非常类似。在准备并执行返回多个结果的 SQL 语句并将返回值（列）绑定到本地变量上之后，可能需要使用 <code>$sth-&gt;fetch</code> 方法来检索这些值。为了展示这个方法是如何工作的，下面让我们从 PT_ADDR_BOOK 表中检索出 phone 和 name 列的内容。清单 15 给出了使用一个循环来使用 <code>$sth_fetch</code> 方法的用法： </p>
<br><a name=listing15><strong>清单 15. 从数据库中检索多个值</strong></a><br>
<table cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
    <tbody>
        <tr>
            <td>
            <pre><code class=section>
            $stmt = "SELECT name, phone from PT_ADDR_BOOK";
            $sth = $dbh-&gt;prepare($stmt);
            $sth-&gt;execute();
            #associate variables with output columns...
            $sth-&gt;bind_col(1,\$name);
            $sth-&gt;bind_col(2,\$phone);
            print "NAME                          PHONE      \n";
            print "-------------------------     -----------\n";
            while ($sth-&gt;fetch) {
            print $name ;
            print $phone; print "\n";              }
            print "DONE \n";
            $sth-&gt;finish();
            </code></pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>执行这段代码的结果如下： </p>
<br><a name=listing16><strong>清单 16. 从数据库中检索多个值</strong></a><br>
<table cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
    <tbody>
        <tr>
            <td>
            <pre><code class=section>
            C:\Dev_POT\PERL\Labs&gt;perl multi.pl
            NAME                          PHONE
            -------------------------     -----------
            JOHN SMITH               9145556677
            STEVE BROWN          7184358769
            DONE
            </code></pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>也可以使用 <code>$sth-&gt;fetchrow</code> 方法从结果集中检索数据。<code>$sth -&gt;fetch</code> 方法会将每个值作为单独一项返回，而 <code>$sth -&gt;fetchrow()</code> 方法则将一行作为一个数组返回，每列的值都是该数组中的一个元素。 </p>
<p>可以使用 <code>fetchrow</code> 方法编写功能相同的 Perl 程序，如下所示： </p>
<br><a name=listing17><strong>清单 17. 从数据库中检索多个值</strong></a><br>
<table cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
    <tbody>
        <tr>
            <td>
            <pre><code class=section>
            $stmt = "SELECT name, phone from PT_ADDR_BOOK";
            $sth = $dbh-&gt;prepare($stmt);
            $sth-&gt;execute();
            print "NAME                          PHONE      \n";
            print "-------------------------     -----------\n";
            while (($name, $phone) = $sth-&gt;fetchrow())
            { print "$name  $phone\n"; }
            </code></pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>我们可以从 实验 3 开始编写并执行一个 Perl 程序，它可以创建一个 DB2 表，向该表中插入一些数据，并返回插入该表中的行数。</p>
<p><a name=IDAC0SJE><span class=atitle>调用存储过程</span></a></p>
<p>下面让我们来创建一个多个步骤的场景，从而详细了解一下如何从 Perl 程序中调用 DB2 的存储过程。首先，创建一个简单的存储过程 SP_GET_LOC，它从表 ORG 中返回某个给定部门的位置（步骤 1）。</p>
<br><a name=listing18><strong>清单 18. 步骤 1：创建存储过程</strong></a><br>
<table cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
    <tbody>
        <tr>
            <td>
            <pre><code class=section>
            create procedure sp_get_loc (in deptin int, out loc varchar(13))
            begin
            select location into loc from org where deptnumb = deptin;
            end  @
            </code></pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>请注意，这个存储过程有一个输入参数和一个输出参数。当我们在 DB2 的命令行处理器（CLP）中运行这个过程时，它对部门 10 会返回位置 NEW YORK。 </p>
<br><a name=listing19><strong>清单 19. 步骤 2：运行存储过程</strong></a><br>
<table cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
    <tbody>
        <tr>
            <td>
            <pre><code class=section>
            $db2 "call sp_get_loc(10,?)"
            Value of output parameters
            --------------------------
            Parameter Name  : LOC
            Parameter Value : New York
            Return Status = 0
            </code></pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>下面让我们来编写一个简单的 Perl 程序来调用存储过程 SP_GET_LOC（步骤 3，请参看 清单 20）。我们的动态 SQL 语句实际上与在 DB2 CLP 中执行的语句相同，形式为 <code>SP_GET_LOC(?,?)</code>，不过在 CLP 中是传递硬编码的 10（部门编号），在动态 SQL 语句中将使用一个参数标记。采用这种方法，就可以对 ORG 表的部门编号列的任何值查询位置了。</p>
<p>在构造 SQL 语句之后，剩下的步骤就与其他具有参数标记的动态语句完全相同了。可以使用 <code>$sth = $dbh-&gt;prepare</code> 方法进行准备。使用 <code>$sth-&gt;bind_param</code> 方法将部门编号绑定为输入参数，使用 <code>$sth-&gt;bind_param_inout</code> 方法将返回的位置绑定为输出参数，然后再执行动态 SQL 语句。</p>
<p>该程序如下：</p>
<br><a name=listing20><strong>清单 20. 步骤 3：调用存储过程</strong></a><br>
<table cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
    <tbody>
        <tr>
            <td>
            <pre><code class=section>
            #!/usr/bin/perl -w
            use DBI;
            use DBD::DB2::Constants;
            $dbh = DBI-&gt;connect("dbi:DB2:sample","","") or
            die "Can't connect to sample database: $DBI::errstr";
            # Prepare our call statement
            $sth = $dbh-&gt;prepare( "CALL SP_GET_LOC(?,?)" );
            # Bind input parameter for department number
            $sth-&gt;bind_param(1, 10);
            # Bind output parameter - location
            $sth-&gt;bind_param_inout (2, \$location, 13,     db2_param_type=&gt;SQL_PARAM_OUTPUT});
            # Call the stored procedure
            $sth-&gt;execute();
            printf("Stored procedure returned location: %s\n", $location);
            $sth-&gt;finish();
            $dbh-&gt;disconnect;
            </code></pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>如果执行这个程序，就会看到给定部门（本例中为 10）的 LOCATION： </p>
<br><a name=listing21><strong>清单 21. 步骤 4：执行调用 DB2 存储过程的 Perl 程序</strong></a><br>
<table cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
    <tbody>
        <tr>
            <td>
            <pre><code class=section>
            $perl test_call_sp.pl
            Stored Procedure returned location: New York
            </code></pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p><a name=IDAE2SJE><span class=atitle>大对象的操作</span></a></p>
<p>使用 Perl 来处理文件比使用其他更复杂的语言（例如 C 或 Java&#174;）都要简单。下面我们就会看到如何将数据直接从文件中导入 DB2 的大对象数据（LOB）列中。插入大对象数据的最有效的方法是，将这个文件直接绑定到 DB2 表中一个与 LOB 类型的列相关联的输入参数上。Perl 驱动程序可以直接从文件中读取数据，并将数据传递给数据库服务器。要将一个文件绑定到某个输入 LOB 参数上，可以在执行 INSERT 操作过程中使用 <code>bind_param</code> 方法来指定 { db2_file =&gt; 1} 参数属性。</p>
<p>在我们的数据库模式 POT 下面有一个表 MAP。这个表有一个 picture 列，它被声明成 BLOB 类型的，用来存放某个地区的图像。下面是创建该表所使用的 DDL：</p>
<br><a name=listing22><strong>清单 22. 创建 MAP 表使用的 DDL</strong></a><br>
<table cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
    <tbody>
        <tr>
            <td>
            <pre><code class=section>
            create table POT.MAPS
            ( map_id           INT,
            map_name     VARCHAR(13),
            area                 INT ,
            photo_format CHAR(3),
            picture            BLOB) ;
            </code></pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>另外，我们还有一个文件 pearcson.jpg，其中包含了 Pearson Airport 的地图。 </p>
<br><a name=fig3><strong>图 3. 示例地图</strong></a><br><img height=513 alt=示例地图 src="http://linux.chinaunix.net/mirror/www-128.ibm.com/developerworks/cn/db2/library/techarticles/dm-0512greenstein/fig3.gif" width=499><br>
<p>现在让我们来编写一个程序，向表 POT.MAP 中插入一行数据，即将 JPG 文件的图像插入到 PICTURE 中。首先，需要构造一个具有 5 个参数标记的动态 SQL 语句。然后，需要对这条语句进行准备。在将参数绑定到准备好的语句上之前，需要指定包含要插入的图像的文件名，并将其赋给一个本地 Perl 变量（<code>$picture_file</code>）。现在可以将所有参数全部绑定到需要插入到 MAP 表中的值上。请注意，我们为最后一个参数指定了 <code>db2_file =&gt;1</code> 属性。最后一个步骤是执行这条 INSERT 语句。这个程序的代码如下：</p>
<br><a name=listing23><strong>清单 23. 插入 LOB</strong></a><br>
<table cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
    <tbody>
        <tr>
            <td>
            <pre><code class=section>
            #!/usr/bin/perl -w
            use DBI;
            use DBD::DB2::Constants;
            %conattr = (   AutoCommit             =&gt; 1,
            # Turn Autocommit On
            db2_info_applname  =&gt; 'Maps Module', );
            # Identify this appl
            $dbh = DBI-&gt;connect("dbi:DB2:sample","", "",\%conattr) or die "$DBI::errstr";
            $dbh-&gt;do("SET CURRENT SCHEMA POT");
            $sql = "INSERT INTO MAPS(map_id, map_name, area, photo_format, picture)
            VALUES(?,?,?,?,?)";
            $sth = $dbh-&gt;prepare($sql);
            $picture_file = "pearson.jpg";           # File containing our picture
            $sth-&gt;bind_param(1, 100);                # map_id
            $sth-&gt;bind_param(2, "Pearson airport");  # map_name
            $sth-&gt;bind_param(3, 416);                # area
            $sth-&gt;bind_param(4, "JPG");              # photo_format
            $sth-&gt;bind_param(5, $picture_file, {db2_file =&gt; 1});
            $rows_affected = $sth-&gt;execute();
            printf("%d rows affected", $rows_affected);
            $sth-&gt;finish();
            $dbh-&gt;disconnect;
            </code></pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p><a name=IDAZ3SJE><span class=atitle>从数据库中读取 LOB 数据</span></a></p>
<p>可以使用标准的 fetch 方法来检索 LOB 数据，例如 <code>fetchrow_array</code> 或 <code>fetchrow_arrayref</code>。DBI 让我们可以使用 <code>LongReadLen</code> 连接属性来设置每次 fetch 可以检索的最大字节数。对于 LOB 列来说，缺省值为 32,700 个字节。要实现这种功能，需要执行以下步骤：</p>
<ol>
    <li>构造 SQL 语句从 MAP 表中选择 picture 列的数据。
    <li>准备 SQL 语句。
    <li>为保存所检索到的图像使用的文件分配一个名字。
    <li>打开该文件。
    <li>执行这条 SQL 语句。
    <li>使用 fetch 方法将结果取到文件中。</li>
</ol>
<p>下面是展示如何从数据库中检索 LOB 数据的代码：</p>
<br><a name=listing24><strong>清单 24. 从数据库中读取 LOB 数据</strong></a><br>
<table cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
    <tbody>
        <tr>
            <td>
            <pre><code class=section>
            #!/usr/bin/perl
            use DBI;
            use DBD::DB2::Constants;
            %conattr =
            (
            AutoCommit             =&gt; 1,
            # Turn Autocommit On
            db2_info_applname  =&gt; 'Maps Module',
            # Identify this appl
            LongReadLen           =&gt; 80000
            # Don't retrieve LOBs
            );
            # Connect to our database
            $dbh = DBI-&gt;connect("dbi:DB2:sample","", "",\%conattr) or
            die "$DBI::errstr";
            # Set the current schema to 'POT'
            $dbh-&gt;do("SET CURRENT SCHEMA POT");
            $sql = "SELECT picture FROM maps WHERE map_name ='Pearson airport'";
            # Prepare the statement
            $sth = $dbh-&gt;prepare($sql);
            # Open output file
            $out_file = "mypic.jpg";
            open(OUTPUT, "&gt;$out_file") or die "Cannot open $out_file because $!";
            binmode OUTPUT;
            $sth-&gt;execute;
            @row = $sth-&gt;fetchrow;
            print OUTPUT $row[0];
            @row = "";
            close(OUTPUT);
            print &#8220;Picture in the file $out_file\n";
            $sth-&gt;finish();
            $dbh-&gt;disconnect;
            </code></pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>在运行这个程序之后，图像就保存到 mypic.jpg 文件中了。</p>
<br><a name=listing25><strong>清单 25. 从数据库中读取 LOB 数据</strong></a><br>
<table cellSpacing=0 cellPadding=5 width="100%" bgColor=#eeeeee border=1>
    <tbody>
        <tr>
            <td>
            <pre><code class=section>
            $perl test_lobread.pl
            Picture in the file mypic.jpg
            </code></pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>请使用 实验 4 中的练习来编写并执行一个 Perl 程序，它从一个表中检索出二进制大对象，并将其保存到一个文件中。</p>
<p><a name=IDAM5SJE><span class=atitle>结束语</span></a></p>
<p>本文是为那些具有关系数据库经验并且希望学习如何编写 Perl 程序来访问 DB2 数据库的 Perl 程序员编写的。在本文中，我们已经学习了如何连接数据库，如何通过 INSERT、UPDATE 和 DELETE 语句来操作数据库的内容。还学习了如何从数据库中检索数据，并介绍了一些高级主题，包括调用存储过程和操作大数据对象（LOB 和 BLOB）。现在我们应该已经准备好使用自己刚掌握的 Perl DB2 编程技巧来开发自己的程序了。 </p>
<p>原文链接：<a href="http://www-128.ibm.com/developerworks/cn/db2/library/techarticles/dm-0512greenstein/index.html" target=_blank>http://www-128.ibm.com/developerworks/cn/db2/library/techarticles/dm-0512greenstein/index.html</a></p>
<img src ="http://www.cppblog.com/prayer/aggbug/106114.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2010-01-21 11:34 <a href="http://www.cppblog.com/prayer/archive/2010/01/21/106114.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>