??xml version="1.0" encoding="utf-8" standalone="yes"?>日韩精品久久无码人妻中文字幕,色播久久人人爽人人爽人人片AV,一本色综合网久久http://www.shnenglu.com/prayer/category/12855.html在一般中L卓越zh-cnTue, 08 Jun 2010 03:35:36 GMTTue, 08 Jun 2010 03:35:36 GMT60shell的效率不如perl或Python? http://www.shnenglu.com/prayer/archive/2010/06/07/117311.htmlPrayerPrayerMon, 07 Jun 2010 04:25:00 GMThttp://www.shnenglu.com/prayer/archive/2010/06/07/117311.htmlhttp://www.shnenglu.com/prayer/comments/117311.htmlhttp://www.shnenglu.com/prayer/archive/2010/06/07/117311.html#Feedback0http://www.shnenglu.com/prayer/comments/commentRss/117311.htmlhttp://www.shnenglu.com/prayer/services/trackbacks/117311.html
shell文本处理斚wQ主要是有sedQawkq两把刀?br>
光给你个shell你进行文本处理是做不到的Q当然简单的q可以?br>
perl里有正则表达式引擎,能针Ҏ本进行拆分替换等复杂操作Q关键是Qperl不用fork出新的进E来处理q些事情Q而shell需要用管道等通过q些sedQawk的进E来处理Q至就多出部分q程的开销?br>
而且Q管道这个东西,原本一个工具一ơ能完成的Q务,在需要经qsedQ和awk{多ơ管道。效率可惌知?br>
其实你这个问题问的有点弱智,SHELL是什么?

SHELL只是一个接口,大部分的功能全靠外部E序来完成?br>而Perl是一U语aQ基本上什么事情都能做?/td>


老老实实学好一样东西最实际?br>当你参加面试的时候,如果可以自信的说自己熟练使用Shell或者PerlQ那q当不错了?br>效率之类的云云,具体问题具体分析吧,能解军_作中遇到的问题就行?br>

看出来楼L较关心文本处理,下面q个比方不一定恰当,但已l很接近了:


  • 相比较而言Qawk、sed像L手,而perl和python是个zL手?br>
  • awk和sed专注于文本处理,大部分情冉|率要优于perl{。很单,比如列文Ӟ谁能有cat的效率高Q?br>
  • 如果你是个懒惰的SAQ那qshell吧。如果是geek或者你的工作需要复杂的逻辑Qƈ且还会出现许多无法预知的新要求,那就用perl{好了?br>


没那么多关键字,是打字手误,但是1-10万数量的关键字Q在千万行文本文g中搜索,q个量还是有的?br>
来段sed multiple keywords search in batch的代码,Ƣ迎其他新想法?
  1.                 local num_in_batch=300
  2.                 local batch_counter=0
  3.                 local log_display_in_batch=1000
  4.                 local bbl_counter=0
  5.                 local num_in_bl_counter=0
  6.                 declare -a bbl_arr=()
  7.                 local keyword=
  8.                 local keyword_del

  9.                
  10.                 logMsg $debug_flag null "Starting blacklist checking in batch."

  11.                 for msisdn in `cut -d: -f2 $tmpfile`; do       
  12.                         if [ $batch_counter -eq $num_in_batch ]; then
  13.                                 keyword="${keyword}$msisdn"
  14.                                 bbl_arr=(`sed -rn "/$keyword/p" $filter_file`)
  15.                                 local num=${#bbl_arr[@]}
  16.                                 ((num_in_bl_counter+=num))
  17.                                 if [ $num -gt 1 ]; then
  18.                                         keyword_del=`echo ${bbl_arr[@]} | tr " " "|"`
  19.                                         sed -ri "/${keyword_del}/d" $inputfile
  20.                                 fi
  21.                                 keyword=
  22.                                 batch_counter=0
  23.                         else
  24.                                 keyword="${keyword}$msisdn|"
  25.                         fi
  26.                         if [ $((bbl_counter%log_display_in_batch)) -eq 0 ]; then
  27.                                 logMsg $debug_flag null "$bbl_counter MSISDN processed."
  28.                         fi
  29.                         ((batch_counter++))
  30.                         ((bbl_counter++))
  31.                 done
复制代码


Prayer 2010-06-07 12:25 发表评论
]]>
Activeperl windows下所有版本官方下载地址http://www.shnenglu.com/prayer/archive/2010/01/29/106748.htmlPrayerPrayerFri, 29 Jan 2010 09:32:00 GMThttp://www.shnenglu.com/prayer/archive/2010/01/29/106748.htmlhttp://www.shnenglu.com/prayer/comments/106748.htmlhttp://www.shnenglu.com/prayer/archive/2010/01/29/106748.html#Feedback0http://www.shnenglu.com/prayer/comments/commentRss/106748.htmlhttp://www.shnenglu.com/prayer/services/trackbacks/106748.htmlActiveperl windows下所有版本官方下载地址
Activeperl windows下所有版本官方下载地址Q?/div>
 
Name                    Last modified      Size  Description

Parent Directory                             -   
5.005/                  01-Aug-2007 23:17    -  
5.6/                    01-Aug-2007 23:17    -  
5.8/                    01-Aug-2007 23:17    -  
 

Index of /ActivePerl/Windows/5.6

Name                                                     Last modified      Size  Description
Parent Directory - unsupported/ 01-Aug-2007 23:17 - ActivePerl-5.6.0.611.msi 17-Mar-2000 22:29 7.8M ActivePerl-5.6.0.613.msi 28-Mar-2000 19:48 8.0M ActivePerl-5.6.0.615-MSWin32-x86-multi-thread.msi 06-Jul-2000 17:00 8.2M ActivePerl-5.6.0.616-MSWin32-x86-multi-thread.msi 14-Jul-2000 22:20 7.9M ActivePerl-5.6.0.617-MSWin32-x86-multi-thread.msi 01-Sep-2000 02:57 8.2M ActivePerl-5.6.0.618-MSWin32-x86-multi-thread.msi 14-Sep-2000 03:27 8.3M ActivePerl-5.6.0.620-MSWin32-x86-multi-thread.msi 01-Nov-2000 03:18 8.2M ActivePerl-5.6.0.623-MSWin32-x86-multi-thread.msi 16-Dec-2000 00:38 7.3M ActivePerl-5.6.0.623-MSWin32-x86-multi-thread.zip 16-Dec-2000 03:55 7.9M ActivePerl-5.6.1.624-TRIAL2-MSWin32-x86-multi-thread.msi 06-Feb-2001 21:17 7.5M ActivePerl-5.6.1.624-TRIAL2-MSWin32-x86-multi-thread.zip 06-Feb-2001 21:18 7.9M ActivePerl-5.6.1.625-TRIAL3-MSWin32-x86-multi-thread.msi 23-Mar-2001 06:06 7.7M ActivePerl-5.6.1.625-TRIAL3-MSWin32-x86-multi-thread.zip 23-Mar-2001 06:06 8.1M ActivePerl-5.6.1.626-MSWin32-x86-multi-thread.msi 02-May-2001 22:35 7.9M ActivePerl-5.6.1.626-MSWin32-x86-multi-thread.zip 02-May-2001 22:37 8.4M ActivePerl-5.6.1.628-MSWin32-x86-multi-thread.msi 05-Jul-2001 19:02 8.0M ActivePerl-5.6.1.628-MSWin32-x86-multi-thread.zip 05-Jul-2001 19:02 8.5M ActivePerl-5.6.1.629-MSWin32-x86-multi-thread.msi 24-Aug-2001 15:40 7.9M ActivePerl-5.6.1.629-MSWin32-x86-multi-thread.zip 24-Aug-2001 15:45 8.5M ActivePerl-5.6.1.630-MSWin32-x86.msi 01-Nov-2001 04:41 12M ActivePerl-5.6.1.630-MSWin32-x86.zip 01-Nov-2001 04:42 12M ActivePerl-5.6.1.631-MSWin32-x86.msi 03-Jan-2002 01:38 8.1M ActivePerl-5.6.1.631-MSWin32-x86.zip 03-Jan-2002 01:39 8.0M ActivePerl-5.6.1.632-MSWin32-x86-bad.msi 03-Jun-2002 23:23 8.5M ActivePerl-5.6.1.632-MSWin32-x86.msi 10-Jun-2002 22:38 8.5M ActivePerl-5.6.1.632-MSWin32-x86.zip 03-Jun-2002 23:23 8.4M ActivePerl-5.6.1.633-MSWin32-x86.msi 20-Jun-2002 17:26 8.6M ActivePerl-5.6.1.633-MSWin32-x86.zip 20-Jun-2002 17:26 8.4M ActivePerl-5.6.1.635-MSWin32-x86-symbols.zip 04-Feb-2003 23:53 4.5M ActivePerl-5.6.1.635-MSWin32-x86.msi 06-Feb-2003 05:48 8.4M ActivePerl-5.6.1.635-MSWin32-x86.zip 10-Feb-2003 21:30 8.3M ActivePerl-5.6.1.638-MSWin32-x86-symbols.zip 16-Apr-2004 19:54 4.5M ActivePerl-5.6.1.638-MSWin32-x86.msi 16-Apr-2004 19:53 8.5M ActivePerl-5.6.1.638-MSWin32-x86.zip 16-Apr-2004 19:54 8.3M MD5SUM 01-Aug-2007 23:17 2.6K


Prayer 2010-01-29 17:32 发表评论
]]>perl语言?/title><link>http://www.shnenglu.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.shnenglu.com/prayer/archive/2010/01/25/106400.html</guid><wfw:comment>http://www.shnenglu.com/prayer/comments/106400.html</wfw:comment><comments>http://www.shnenglu.com/prayer/archive/2010/01/25/106400.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/prayer/comments/commentRss/106400.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/prayer/services/trackbacks/106400.html</trackback:ping><description><![CDATA[<table style="TABLE-LAYOUT: fixed; WIDTH: 100%"> <tbody> <tr> <td> <div id="tvdhdt9" 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>{字的羃写,是一U能扫视L文字文gQƈ且能从中取出信息制成报表的解译语a<span>(Interpreter)</span>。如果你?span>UNIX</span>的话Q它的目 的就是用来取?span>UNIX</span>原有?span>sed</span>?span>awk</span>?span>shell script</span>的组合,用来汇集信息、生报表的一个工兯a<span>(</span>E序<span>)</span>?span>Perl</span>的作者是<span>Larry Wall <lwall@netlabs.com></span>。他曄贡献q好几个很有用的<span>Public Domain</span>E序l大家用,包括<span>patch</span>?span>rn</span>。他设计<span>Perl</span>时的哲学是以实用为第一优先<span>(</span>所谓的实用是语言Ҏ使用、有效率Q而且完整<span>)</span>Q而不 是设计一个看h很漂亮的语言<span>(</span>漂亮是E序非常的小Q语法幽雅,而且只由最的语法基本元素构成<span>)</span>Q所以只要你学上手了Q你׃深深的喜Ƣ上<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>q几个工h好的特色Q而且主要的语法很接近<span>C</span>语言Q对原本熟悉<span>C</span>语言的h来说非常Ҏ上手。就我个人的l验Q除?span>C</span>以外Q如果能再懂<span>shell script</span>的语法是最好不q了Q因?span>Perl</span>中一些符L使用?span>shell script</span>是一致的。当然如果又懂得<span>awk</span>?span>sed</span>那就更好了?span>Larry Wall</span>说过一句话Q?span>Perl</span>是懒人用的工兗?span>(</span>于我心有戚戚?span>^_^)</span>。如?span>Perl</span>不是比其它语a更好更简单更Ҏ上手Q恐怕很h愿意d习新的程序语a?<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>的特性,Ҏ处理字符串参数的传递,自然成了某些Ҏ用途的新宠Q尤其是<span>CGI</span>Q彷?span>Perl</span>天生是ؓ?span>CGI</span>而设计的<span>! </span>事实?span>CGI</span>本n定义是和使用的程序语aU类无关的,你可以用<span>C</span>?span>Fortran</span>、甚?span>Visual Basic</span>?span>Delphi</span>来写<span>CGI</span>E序。那Z么大家现在都采用<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">有非常杰出的文字处理能力Q能LC?span>HTML</span>檔,其它具有完整的<span>Regular Expression</span>语法Q得在<span>C</span>语言看来必需要写一大串E序代码的功能,<span>Perl</span>几行p决了?<span></span></span> <li style="TEXT-ALIGN: left"><span style="FONT-SIZE: 12pt">⊙Perl</span><span style="FONT-SIZE: 12pt">是一U直译式语言Q因此可以避免在各种不同pȝ上,q需要重新编译的ȝ?<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>Q避免被未经授权?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">个语a的好坏,我想我们可以从三个方向来看:数据型?span>(data type)</span>、流E控制叙q?span>(control statements)</span>、特D功能?<span></span></span></p> <ul type=disc> <li style="TEXT-ALIGN: left"><span style="FONT-SIZE: 12pt">Q?span>.Perl</span>的数据型态跟<span>C</span>语言?span>Pascal</span>不大一P但它也支持指?span>(pointer</span>Q?span>Perl5</span>以后才支?span>)</span>Q所以也可以?span>C</span>语言一L合出很复杂的数据l构<span>(data structure)</span>。特别的?span>Perl</span>有一U新?span>data type</span>Q相xl,它和一般数l没什么不同,差别只在它的索引值是用字W串Q而非一般常用的整数|因此相关数组不像一般数l一hơ序的概念,它没有所谓的W一Ҏ据这U说法。我个h认ؓ如果能善用这U?span>data type</span>会带l你意想不到的收获哦?span></span></span> <li style="TEXT-ALIGN: left"><span style="FONT-SIZE: 12pt">Q?span>.Perl</span>的条件控制叙q?span>(conditional control statements)</span>与@环控制叙q?span>(loop control statements)</span>几乎?span>C</span>语言一模一P甚至语法和一些常用的指o也和<span>C</span>语言很类|q对一般用者而言是很方便的,可以很快的让使用者进入状况, q一步了?span>Perl</span>的精华。而在<span>Perl5</span>中又引进了模块化和区域变?span>(local variables)</span>的观念,大大的增Z<span>Perl</span>的能力,?span>Perl</span>几乎变得无所不能?<span></span></span> <li style="TEXT-ALIGN: left"><span style="FONT-SIZE: 12pt">Q?span>.Perl</span>处理字符串的能力是众所皆知的,除了它的U量变量<span>(scalar variable)</span>可以很轻易的存取字符Ԍ特别的是<span>Perl</span>提供?span>UNIX</span>很相q的<span>Regular Expressions</span>语法Q这U格式L?span>(pattern-matching)</span>的语法很复杂但十分强大,大大地增Z<span>Perl</span>处理字符串的能力Q要善用<span>Perl</span>处理字符串的能力Q就得先?span>Regular Expressions</span>痛下一番功夫不可。这个东东实在不好懂Q不q只要你用上了手Q真的是如虎ȝQ每ơ用时都会为它强大的功能窃喜,反而觉?span>C</span>qxE无奇。另?span>Perl</span>有一堆特D的全域变量<span>(global variables)</span>Q用来设定程序的执行环境和其它细节,可能到数组索引的v始|大到输出字段的分隔符号都有媄响。这么多的特D变量对大多数的言是只是个困扰Q但是我若要深入了解<span>Perl</span>、善?span>Perl</span>Q最好多了解q些Ҏ变量的意义?<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>也是有缺点的Q最令h垢病的就是执行速度。由?span> Perl</span>是直译式的程序语a<span>(Interpreter)</span>Q不需要事先经q编?span>(compile)</span>Q这一点在发展E序初期很有用,E序写好了就可以直接 <span>run</span>了,但缺ҎE序执行的速度会变慢,不利于发展大E序或系l程序。不q?span>Perl</span>对上qC般解译语a的缺点做了一Ҏ良,它在执行时会先加载整个程?码,q执行初步的<span>compile</span>Q包括语法检查和建立W号表,因此<span>Perl</span>比一?span>script</span>语言安全而且快多了。但是就我观察所得,<span>Perl</span>有一些设?实在很浪费内存和<span>CPU</span>Q似?span>Perl</span>q不很在意内存和速度Q而是以实用性和方便性ؓ优先考虑。其实由于硬件技术的q步Q对现在来说Q内存和<span>CPU </span>速度已经不是那么令h在意Q反而程序的安全性和亲和性才是考虑的重点,?span>Microsoft WORD</span>q只大怪兽一P所以对速度要求比较多的玩家Q也只有请你多多忍耐了?<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>的优点多多,其是它优异的处理字W串能力Q更使它异军HvQ成?span>CGI</span>E序的新宠,q也是ؓ什?span>Perl</span>会流行v来的主要原因?<span></span></span></p> </div> </td> </tr> </tbody> </table> <img src ="http://www.shnenglu.com/prayer/aggbug/106400.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/prayer/" target="_blank">Prayer</a> 2010-01-25 16:23 <a href="http://www.shnenglu.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.shnenglu.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.shnenglu.com/prayer/archive/2010/01/25/106399.html</guid><wfw:comment>http://www.shnenglu.com/prayer/comments/106399.html</wfw:comment><comments>http://www.shnenglu.com/prayer/archive/2010/01/25/106399.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/prayer/comments/commentRss/106399.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/prayer/services/trackbacks/106399.html</trackback:ping><description><![CDATA[<table style="TABLE-LAYOUT: fixed; WIDTH: 100%"> <tbody> <tr> <td> <div id="jlnbvln" class=cnt id=blog_text> <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">q个英文单词的发音似</span><span style="FONT-SIZE: 12pt; COLOR: black">“</span><span style="FONT-SIZE: 12pt; COLOR: black">z森</span><span style="FONT-SIZE: 12pt; COLOR: black">”</span><span style="FONT-SIZE: 12pt; COLOR: black">Q因此中文可以称之ؓz森?/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">q历史的</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">的创始h?/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">是一U即译式的,互动的,面向对象的编E语aQ它包含了模l式的操作,异常处理Q动态资料Ş态,十分高层ơ的动态资料结构,以及cd的用?/span><span style="FONT-SIZE: 12pt; COLOR: black">Python</span><span style="FONT-SIZE: 12pt; COLOR: black">?合了单的语法和强大的功能。它的语法表达优易诅R它h很多优秀的脚本语a的特点:解释的,面向对象的,内徏的高U数据结构,支持模块和包Q支持多U?q_Q可扩展。而且它还支持交互式方式运行,囑Ş方式q行。它拥有众多的编E界面支持各U操作系l^C及众多的各类函数库。利?/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">可以对它q行扩充。个别的应用软g如果需要有一个可E序化界面也可以利用它来做ؓ扩展语言用。最后,</span><span style="FONT-SIZE: 12pt; COLOR: black">Python</span><span style="FONT-SIZE: 12pt; COLOR: black">的可UL度非帔R</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">cd^Cq行Q在</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">Q?/span><span style="FONT-SIZE: 12pt; COLOR: black">Windows NT</span><span style="FONT-SIZE: 12pt; COLOR: black">Q?/span><span style="FONT-SIZE: 12pt; COLOR: black">OS/2</span><span style="FONT-SIZE: 12pt; COLOR: black">Q?/span><span style="FONT-SIZE: 12pt; COLOR: black">BeOS</span><span style="FONT-SIZE: 12pt; COLOR: black">Q以?/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 ><font color=#000000><u>http://www.python.org/</u></font></a> </span><span style="FONT-SIZE: 12pt; COLOR: black">Q其中你可以扑ֈ很多资料。如果您W一ơ?/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">可以用在许多场合。当你需要大量的动态调_要容易用,功能强大q且富有Ҏ的情况Q?/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>l现有的应用E序d一个宏语言或底E编Ӟ<span>scripting</span>Q能力。经q稍微的训练Q它使用L别的底稿~制变得单。发展一U新的语a常常被认为是大公司独家专利?span>Python</span>是一个你可以加入你现有工L宏语aq合不同的层ơ的Z用?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">开发Y件花贚w财需要很多时间才能达到很好的效果。在<span>Python</span>下创建对象,你可以比我们知道的Q何语a用更短的代码和更的旉Qƈ且全部支持承,密封和多形性。一个比较流行的办法是在<span>Python</span>中原型一个程序,直到你相信设计是正确的再换到<span>C++</span>中,一个更好的办法是将<span>Python</span>应用E序轮廓化,然后?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">新程序和代码库需要测试。有l验的开发h员知道给一个新功能或程序徏立一个测试套件会节约旉q减麻烦。如果一个程序可以与输入输出文g工作Q?span>Python </span>可以生成输入Q运行这个程序,然后查输出ƈq行分析。如果问题在于数据,你可以编写一ơ性的脚本来检查数据是否一致?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">你可能会数据由一个数据库Ud一个新的数据库Q或新徏一个界面让数据在互不兼容的pȝ中流动。如果h工来做,q会是一个很J琐而且Ҏ犯错误的q程Q你M遗漏东西Q到头来你还得重做以前的工作?span>Python</span>对列表和字典的本地支持复杂的数据{换更加容易。而且q种交互式模式可以让~程人员在{换过E的每一阶段观看数据。还可以~写由源到目标的数据转换的脚本ƈ按需要不断运行,直到它正完成工作?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">互不兼容的系l常帔R要被联在一P而且q个q程需要自动进行?span>Python</span>支持所有的集成关键技术。同时也很好的与文gQ协议,<span>DLLs</span>?span>COM</span>对象工作?span>Python</span>q提供广泛的库帮助你得到几乎MU类的数据。它q是很好的控制其他套件、进行系l管理以及控制其他系l数据流动的工具?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%">q行方式</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">可以以命令行方式q行Q也可以交互式方式运行,q具有图形集成环境,q样开?span>Python</span>q当方ѝ现在已l出C许多?span>Python</span>~写的可视化~程软gQ用于实现象<span>Delphi</span>一L功能?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">是一个真正的面向对象语言。它甚至支持异常的处理。如果学q?span>Java</span>Q应该对q个不陌生。但其它的脚本语aQ如<span>PHP</span>Q好象就没有。这使得E序的编写更加清晎ͼ而不需要许多的错误查了?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">q一Ҏ象是<span>Java</span>。对?span>Java</span>的支持,大家可以了解<span>JPython</span>?span>JPython</span>是用<span>Java</span>写的<span>Python</span>Q它完全支持<span>Java</span>Q在q个环境下?span>Python</span>可以随意C?span>Java</span>的类库。语a扩展可以?span>C</span>?span>C++</span>?span>Java</span>?span>Python</span>~写新的新言模块Q如函数。或者与<span>Python</span>直接~译在一P或者采用动态库装入方式实现。也专门有h~写了一个工P可以实现?span>Python</span>自动实现函数接口装Q这是<span>SWIG</span>Q?span>Simplified Wrapper and Interface Generator)</span>Q或U做单封装和接口生成?span>(</span>可以?span><a ><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>对,或其它符号对Q而是采用~近表示法!有趣吧。就q一Ҏ_<span>Guido</span>的解释是Q首先,使用~近表示法减了视觉上的混ؕQƈ且ɽE序变短Q这样就减少了需要对基本代码单元注意的范_其次Q它减少了程序员的自由度Q更有利于统一风格Q得阅d人的E序更容易。感觉还是不错的Q就<span>C</span>语言来说Q在<span>if</span>语句后面大括L写法好几种Q不同的人喜Ƣ不同的样子Q还不如l一hQ都不会看得别扭?/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">在每个类或函数的定义后面Q第一行可以是说明语句Q根本不需要注释符标记。对于后面跟块语句的语句Q后面应跟上一个冒受一行语句不能太长,因ؓ没有行结束符Q如果超长则要用箋行符</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>   </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><></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>语言开发,使用它您可以方便的构建内容管理、内部网、门L站、和其他的定制应用?/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;        </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;        </a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>可以q行在几乎所有流行的操作pȝ?/a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>,</a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>支持多语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;        </a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>能集成到其他行的服务器Q也自带服务器?/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;        </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>表示的分R?/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;        </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>上的一个用户友好、功能强大的开放源代码内容理pȝ?/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>外部|的服务器、文档发布系l、门h务器和异地协同群件工P到目前,</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;        </a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>是一U功能强大的开放源?/a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>(Open Source)</a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>内容理pȝ</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;        </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>览器来讉K、编辑内容和理</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;        </a></span><span style="FONT-SIZE: 12pt; COLOR: black"><a>无需~程Q即可创建新的内容类型?/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;        </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 ><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 ><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.shnenglu.com/prayer/aggbug/106399.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/prayer/" target="_blank">Prayer</a> 2010-01-25 16:21 <a href="http://www.shnenglu.com/prayer/archive/2010/01/25/106399.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows下用Perlq接DB2http://www.shnenglu.com/prayer/archive/2010/01/25/106374.htmlPrayerPrayerMon, 25 Jan 2010 03:17:00 GMThttp://www.shnenglu.com/prayer/archive/2010/01/25/106374.htmlhttp://www.shnenglu.com/prayer/comments/106374.htmlhttp://www.shnenglu.com/prayer/archive/2010/01/25/106374.html#Feedback0http://www.shnenglu.com/prayer/comments/commentRss/106374.htmlhttp://www.shnenglu.com/prayer/services/trackbacks/106374.html原文参见http://www.db2mag.com/story/showArticle.jhtml?articleID=59301551

1. Perl的DB2驱动
Perl语言本n׃多做介绍了?
1994q发布的DBI是Perl语言q接关系性数据库的标准。可以从dbi.perl.org获得DBI的源代码和文档?
IBM?995q发布了对于Perl的DB2驱动Q这个驱动是W合DBI标准的,在Perl里这个驱动称为DBD::DB2 。可以从ibm.com/software/db2/perl获得DBD::DB2驱动的最C息?

注意Q最q的DB2驱动需要至Perl 5.005_03和DBI 1.21或以上的版本?

2. 准备环境
步骤如下
(1)安装Perl语言环境
Windows下可以从www.activestate.com获得Perl的安装包?
安装后可以用perl -v看看Perl的版本信息?
DBI驱动和DBD::DB2驱动都是作ؓPerl的附加模块用ppm工具安装的。安装方法参?2), (3)Q安装时最好先去ibm.com/software/db2/perl上看看ppm后面的参数有没有变化?

(2)安装DBI驱动
ppm install http://ftp.esoftmatic.com/outgoing/DBI/5.8.4/DBI.ppd

(3)安装DBD::DB2驱动
ppm install http://ftp.esoftmatic.com/outgoing/DBI/5.8.4/DBD-DB2.ppd

(4)安装DB2 runtime client


3. 使用Perlq接DB2
(1)使用DBI函数DBI->;data_sources 来扫描DB2数据库目录ƈq回一个包含了有效数据源名U?DSN)的数l?
----------------datasources.pl-------------
#!/usr/lib/perl -w
#
# This perl script prints the list of cataloged DB2 data-sources
#
use DBI;
use DBD::DB2;
use DBD::DB2::Constants;

print "Operating Systems = $^O\n";
print "Perl Binary = $^X\n";
print "Perl Version = $]\n";
print "DBI Version = $DBI::VERSION\n";
print "DBD::DB2 Version = $DBD::DB2::VERSION\n\n";

my @DB2DataSources = DBI->;data_sources("DB2");

print "Available DB2 DSNs:\n\n";

foreach my $dsn ( @DB2DataSources )
{
print " $dsn \n";
}
-------------------END----------------------

(2)获取db2数据库的信息
----------datasourceInfo.pl--------------------------
#!/usr/lib/perl -w
#
# This perl script prints the information DB2 database
#
use DBI;
use DBD::DB2;
use DBD::DB2::Constants;

my $dsn = 'dbi:DB2:SAMPLE';
my $uid = 'henry';
my $pwd = 'happyday';

my $dbh = DBI->;connect( $dsn, $uid, $pwd )           || die "$DBI::errstr";

print "Database Connection Information \n\n";
printf( "Server Instance     : %s\n", $dbh->;get_info( SQL_SERVER_NAME ) );
printf( "Database Server     : %s\n", $dbh->;get_info( SQL_DBMS_NAME ) );
printf( "Database Version    : %s\n", $dbh->;get_info( SQL_DBMS_VER ) );  
printf( "Database Alias      : %s\n", $dbh->;get_info( SQL_DATA_SOURCE_NAME ) );
printf( "Database Codepage   : %s\n", $dbh->;get_info( 2519 ) );
printf( "Application Codepage: %s\n", $dbh->;get_info( 2520 ) );
printf( "Authoriztion Id     : %s\n", $dbh->;get_info( SQL_USER_NAME ) );
printf( "Max Idntifier Len   : %s\n", $dbh->;get_info( SQL_MAX_IDENTIFIER_LEN ) );
printf( "Max Table Name Len  : %s\n", $dbh->;get_info( SQL_MAX_TABLE_NAME_LEN ) );
printf( "Max Index Size      : %s\n", $dbh->;get_info( SQL_MAX_INDEX_SIZE ) );
printf( "Max Columns in Table: %s\n", $dbh->;get_info( SQL_MAX_COLUMNS_IN_TABLE ) );
-------------------END----------------------

(3)获取db2数据库的元数?比如, 表结?
----------tableinfo.pl--------------------------
#!/usr/lib/perl -w
#
# This perl script prints the information of cataloged DB2 table
#
use DBI;
use DBD::DB2;
use DBD::DB2::Constants;

$dsn = 'dbi:DB2:SAMPLE';
$uid = 'henry';
$pwd = 'happyday';

# Connect to the SAMPLE database
$dbh = DBI->;connect( $dsn, $uid, $pwd )           || die "$DBI::errstr";

# Get the tables for schema HENRY
$sth = $dbh->;table_info( { 'TABLE_CSHEM' =>; "HENRY" } );

$table_counter = 0;
while ( @row = $sth->;fetchrow_array )
{
$catalog = $row[0];
$schema = $row[1];
$table = $row[2];

$table_counter++;
printf( "Table %d %s\n", $table_counter, $table );

# Now get the column information for this table
$sth_col = $dbh->;column_info( $catalog, $schema, $table, '%' );
if( $sth_col )
{
while( @row_col = $sth_col->;fetchrow_array )
{
# @row_col has a lot more information. I'll just take
# these three fields as an example
$column_name = $row_col[3];
$type_name   = $row_col[5];
$column_size = $row_col[6];

printf( "  %-24s%s(%s)\n", $column_name, $type_name, $column_size );
}

$sth_col->;finish();
}
}

$sth->;finish();
$dbh->;disconnect;
-------------------END----------------------

(4)执行SQL
----------executesql.pl--------------------------
#!/usr/lib/perl -w
#
# This perl script manipulate DB2 table
#
use DBI;
use DBD::DB2;
use DBD::DB2::Constants;

$dsn = 'dbi:DB2:SAMPLE';
$uid = 'henry';
$pwd = 'happyday';

# Connect to the SAMPLE database
$dbh = DBI->;connect( $dsn, $uid, $pwd )           || die "$DBI::errstr";

# Prepare our insert statement
$sth = $dbh->;prepare( "INSERT INTO sales VALUES('2005-06-25', 'Tom', 'Beijing', 15)");
$sth->;execute();
$sth->;finish();
$dbh->;disconnect;
-------------------END----------------------


Prayer 2010-01-25 11:17 发表评论
]]>
通过Perl ~程讉KDB2数据?http://www.shnenglu.com/prayer/archive/2010/01/21/106114.htmlPrayerPrayerThu, 21 Jan 2010 03:34:00 GMThttp://www.shnenglu.com/prayer/archive/2010/01/21/106114.htmlhttp://www.shnenglu.com/prayer/comments/106114.htmlhttp://www.shnenglu.com/prayer/archive/2010/01/21/106114.html#Feedback0http://www.shnenglu.com/prayer/comments/commentRss/106114.htmlhttp://www.shnenglu.com/prayer/services/trackbacks/106114.html在本文中Q我们将学习如何~写单的 Perl E序来提取或操作 IBM® DB2® Universal Database™QDB2 UDBQ中存储的数据。我们将从一个简单的d入手Q从数据库中选择一行数据放入一?Perl E序中;接着逐步介绍一些高U主题,包括处理大对象和调用存储q程?/blockquote>

?/span>

PerlQPractical Extraction and Report LanguageQ是一U功能强大而又非常单易用的~程语言Q在很多操作pȝ上都可以使用。Perl 是免费的。我们可以(以源代码或二q制的格式)下蝲q个语言Qƈ可以免费C用它?/p>

Perl 日渐成ؓ一U广受欢q的语言。它包含?C ~程语言的特性,以及 UNIX® 中的一些命令,例如 awk ?sed。Perl 是一U解释语aQ可以在单独的应用程序中使用Q也可以?Apache 一h构徏 Web 应用E序?/p>

我们可以使用 Perl 快速操作来自文件或 RDBMS 的大型数据集。DBI 是在 Perl 脚本中连?RDBMS 的标准,它是?1994 q开始引入的。在 http://dbi.perl.org/ 站点上可以找?DBI 驱动E序的源代码及其文档?/p>

IBM ?1992 qؓ Perl 开发了 DB2 的驱动程序,q着 DBI 规范的发展周期性地对其q行更新。这个驱动程序的最新版本(在撰写本文时Q是 0.78。在 http://www.ibm.com/software/data/db2/perl/ 上可以找C要的 DBD::DB2Q这?Perl 语言中采用的命名机制Q驱动程序信息?/p>

本文展C如何编写简单的 Perl E序来提取或操作 DB2 UDB 中存储的数据。我们将从一个简单的d入手Q从数据库中选择一行数据放入一?Perl E序中;接着逐步介绍一些高U主题,包括处理大对象和调用存储q程?/p>

开?/span>

?1 展示?Perl 环境如何与数据库环境q行交互Q?/p>
?1. Perl 环境
Perl 环境

正如可以从这个图中看出的QPerl E序使用了一个标准的 API 来与 DBIQPerl 的数据库接口模块Q进行通信。Perl DBI 模块只能支持动?SQL。它定义了一l方法、变量和U定来提供一个与实际使用的数据库独立的一致数据库接口。DBI ?API 提供了一个一致的接口Q它可以适用于程序员想用的M数据库。DBD::DB2 是一?Perl 模块Q当?DBI 一起用时Q它可以让 Perl ?DB2 UDB q行通信?/p>

因此Qؓ了运行访?DB2 数据库的 Perl 脚本Q需要在pȝ上安装以下组Ӟ

  • Perl 语言环境
  • DBI 驱动E序Q可以用于Q?RDBMSQ?
  • DBD::DB2 驱动E序
  • DB2 Runtime Client
  • C ~译?
  • DB2 数据库服务器的连接信?/li>

?http://www.ibm.com/software/db2/perl/ ?Web 站点上可以看到所有的安装配置指南?/p>

q接?DB2 数据库上

Z?Perl E序讉K DB2 数据库,需要徏立到数据库的q接。ؓ了让 Perl 加蝲 DBI 模块Q需要在 Perl DB2 应用E序中包含下面的内容Q?/p>

use DBI;

当?DBI->connect 语句Q语法如下)来创Z?em>数据库句?/em> ӞDBI 模块会自动加?DBD::DB2 驱动E序?/p>
清单 1. 创徏数据库句?/strong>

            use DBI;
            $dbh = DBI->connect (“dbi:DB2:dbalias", $UserId, $password);
            

其中Q?/p>
$dbh —?表示 connect 语句所q回的数据库句柄
dbalias —?表示分类q?DB2 数据库目录中?DB2 别名
$userID —?表示用来q接数据库的用户 ID
$password —?表示q个用户 ID 的密?/td>

清单 2 展示了一个简单的 Perl E序Q它建立到数据库 SAMPLE 的连接,q返回今天的日期。这个程序执行一条动态生成的 DB2 SQL 语句Q从数据库中获取 CURRENT DATE。它使用 DBI -> bind_col Ҏ数据库中的g递到一个本地变量中Q稍后我们就会讨个问题?/p>
清单 2. q接到数据库上ƈ执行语句

            #!/usr/local/bin/perl -w
            use DBI;
            use strict;
            # Open a connection
            my $dbh = DBI->connect("dbi:DB2:sample", “DB2ADMIN", “db2admin“, {RaiseError => 1});
            # use VALUES to retrieve value from special register
            my $stmt = "Values CURRENT DATE";
            my $sth = $dbh->prepare($stmt);
            $sth->execute();
            # associate variables with output columns...
            my $col1;
            $sth->bind_col(1,\$col1);
            while ($sth->fetch) { print "Today is: $col1\n"; }
            $sth->finish();
            $dbh->disconnect();
            

错误处理 —?SQLCODE ?SQLSTATE

Zq回与某?Perl DBI 数据库句柄或语句句柄相关?SQLSTATEQ可以调?state Ҏ。例如,要返回与数据库句?$dbhandle 相关?SQLSTATE Q可以在应用E序中用下面的 Perl 语句Q?/p>

my $sqlstate = $dbhandle->state;

Zq回与某?Perl DBI 数据库句柄或语句句柄相关?SQLCODEQ可以调?err Ҏ。例如,要返回与数据库句?$dbhandle 相关?SQLCODEQ可以在应用E序中用下面的 Perl 语句Q?/p>

my $sqlcode = $dbhandle->err;

errstr Ҏq回与某?Perl DBI 数据库句柄或语句句柄相关?SQLCODE 的消息。我推荐使用q个ҎQ因个方法可以给出有?SQL 语句p|的更多信息?/p>

清单 3 中的例子展示了这个方法的用法Q?/p>
清单 3. q回错误消息?errstr Ҏ

            $dbh = DBI->connect("dbi:DB2:sample",“USERID",“password") or
            die “Can't connect to sample database: $DBI::errstr";
            $sth = $dbh->prepare(“SQL statement“) or   die "Cannot prepare: " $dbh->errstr;
            $sth->>execute() or   die "Cannot execute: " $sth->errstr;
            

现在让我们进一步看一下第一个实验。它展示了一?Perl E序Q这个程序用作为参C入的用户 ID 和密码来q接数据?SAMPLE。当传递了有效?ID 和密码时Q它会返回一条消息说明连接成功了。下面是 lab1.pl 的代码:


清单 4. lab1.pl

            #!/usr/local/bin/perl –w
            use DBI;
            $db2user = $ARGV[0];
            $pasw = $ARGV[1];
            # Open a connection
            $dbh = DBI->connect("dbi:DB2:sample", $db2user, $pasw)  or
            “Can't connect to sample database: $DBI::errstr";
            print "Connection is successful !!\n";
            

?2 l出了用有效n份验证和无效w䆾验证来执行这个程序的l果Q?/p>
?2. 执行 lab1.pl
执行 lab1.pl

 

执行 SQL 语句

下面让我们来~写一个程序,在数据库 SAMPLE 中创Z个表 PT_ADDR_BOOK。要执行在编写应用程序时已l知道的 SQL 语句Q可以?$dbh->do Ҏ。这个方法的语法如下所C:

my $cnt = $dbh->do(SQL statement);

其中 $cnt 是这?SQL 语句所影响的行数?/p>

使用q个ҎQ我们的E序创徏了一?DB2 表,如清?5 所C:


清单 5. 用来创徏 DB2 表的E序

            #!/usr/local/bin/perl -w
            use DBI;
            use DBD::DB2::Constants;
            $dbh = DBI->connect("dbi:DB2:sample","","") or
            die “Can't connect to sample database: $DBI::errstr";
            $rcount = $dbh->do (“CREATE TABLE PT_addr_book(name char(30),
            phone char(10))");
            print “Returns: $rcount\n";
            

可以使用相同?do Ҏ?PT_addr_book 表中插入几行数据。请注意Q所插入行的值在~写q个E序旉是已知的Q因此可以硬~码在代码中?/p>
清单 6. 使用 do Ҏ插入几行数据

            #!/usr/local/bin/perl -w
            use DBI;
            use DBD::DB2::Constants;
            $dbh = DBI->connect("dbi:DB2:sample","","") or
            die "Can't connect to sample database: $DBI::errstr";
            $rcount = $dbh-> do ("Insert into PT_ADDR_BOOK values
            ('Gregory Whales','9142712020'),
            ('Robert Moses', 2127652345')");
            print "Returns: $rcount \n";
            

正如从这个例子中可以看到的,q条 SQL 语句会媄响两行数据。通过?DB2 CLP 中对q个表运?SELECT 语句Q可以确定有两行数据已经插入了这个表中?/p>
清单 7. test_do_exs.pl

            $perl test_do_exs.pl
            Returns : 2
            $db2 “select * from PT_ADDR_BOOK"
            NAME                               PHONE
            ------------------------------ ----------
            Gregory Whales                 9142712020
            Robert Moses                   2127652345
            2 record(s) selected.
            

下面让我们从 下蝲 一节中实验 2 的练习开始,~写q执行一个简单的 Perl E序来更?PR_ADDR_BOOK 表?/p>

INSERT、UPDATE ?DELETE 语句 —?没有占位W?/span>

执行一条在~写应用E序时还未确定的 SQL 语句Q动?SQLQ需要用一U不同的技术,可以使用 $dbh->prepare Ҏ来实现。动?SQL 可以通过在程序执行过E中自己修改列、表和谓词(操作Q的能力来实现。动?SQL 需要由 UDB 优化器来准备 执行Q目的是条语句创Z个访问计划。如果动?SQL 没有参数标记Q占位符Q,它就可以在这个步骤之后立x行。清?8 l出?$dbh->prepare ?$sth->execute Ҏ的语法,可以?Perl E序中用来执行没有占位符的嵌入式 SQL 语句Q?


清单 8. 动?SQL 的准备和执行

            $stmt = “SQL Statement without placeholder“;
            $sth = $dbh->prepare($stmt);
            $sth->execute();
            

h意,$dbh->prepare Ҏ的结果是 SQL 语句句柄?/p>

清单 9 中给出的 Perl E序展示了如何用这些方法将一行数据插入到 PT_ADDR_BOOK 表中Q?/p>
清单 9. 插入一行数?/strong>

            #!/usr/local/bin/perl -w
            use DBI;
            use DBD::DB2::Constants;
            $dbh = DBI->connect("dbi:DB2:sample","","") or
            die “Can't connect to sample database: $DBI::errstr";
            $stmt = "INSERT INTO PT_addr_book values ('JOHN SMITH','9145556677')“;
            $sth = $dbh->prepare($stmt);
            $sth->execute();
            print "We inserted row into addr_book\n";
            $sth->finish();
            

h参数标记?SQL 语句

现在让我们来看一下如何执行在~写应用E序时还不确定ƈ且具有参数标讎ͼ卛_位符Q的 SQL 语句 —?即真正的动?SQL 语句。请注意Q我们推荐用这U?SQL 语句Q因为它们具有性能和安全性方面的优点。从性能的角度来看,动?SQL 语句只需要准备一ơ就可以执行多次Q可以重用相同的数据库访问计划。从安全性的角度来看Q占位符可以保只有一个值可以插入到q条语句中,从而可以避免出?SQL 语句错误?/p>

Z?Perl E序动?SQL 语句转换成可执行的格式,需要首先?prepare ҎQ然后?bind_param Ҏ来绑定参数。只有这h可以执行q条语句。要l定每个参数Q需要指定参数标记的个数Q以及包含这些参数标记值的本地 Perl 变量的名字。清?10 l出了让 Perl E序执行动?SQL 语句所使用的方法的语法Q?/p>
清单 10. 动?SQL 的方?/strong>

            $stmt = “SQL Statement with parameter marker“;
            $sth = $dbh->prepare($stmt);
            $sth->bind_param(1,$parm,\% attr);
            $sth->execute();
            

清单 11 展示了对?PT_ADDR_BOOK 执行 INSERT 操作的方法。现在,所插入列的g再是?SQL 语句中硬~码的了Q而是使用参数标记动态传递给q条语句的;q些参数标记已经使用 $sth->bind_param Ҏ与这条语句进行了l定。只有完成这些设|之后,才开始执行这条语句?/p>
清单 11. 对表 PT_ADDR_BOOK 执行 INSERT 操作

            #!/usr/local/bin/perl -w
            use DBI;
            use DBD::DB2::Constants;
            $dbh = DBI->connect("dbi:DB2:sample","","") or
            die “Can't connect to sample database :DBI::errstr";
            $name ="STEVE BROWN";
            $phone = "7184358769";
            $stmt = "INSERT INTO PT_addr_book values (?,?)";
            $sth = $dbh->prepare($stmt);
            $sth->bind_param(1,$name);
            $sth->bind_param(2,$phone);
            $sth->execute();
            print "We inserted row into addr_book\n";
            $sth->finish();
            

从数据库中检索数?—?单个l果

Z数据库中的值放?Perl E序中用,需要按照下面的步骤执行Q?/p>

  1. 准备 SELECT 语句?
  2. 执行所准备的语句?
  3. 使用 $sth->bind_col Ҏ把某列的|或函敎ͼ兌C个本?Perl 变量上?
  4. 使用 $sth->fetch Ҏ一个值取到本地变量中?/li>

下面的伪码展CZ如何从数据库中检索单个|


清单 12. 从数据库中检索单个?/strong>

            $stmt = “SQL SELECT Statement to be executed“;
            $sth = $dbh->prepare($stmt);
            $sth->execute();
            $result = $sth->bind_col(col, \variable [, \%attr ]);
            while ($sth->fetch){
            process result of the fetch;
            }
            

下面q个例子展示了如何ؓ一个聚合函?max ?EMPLOYEE 表中?salary 的|


清单 13. 合函数检索?/strong>

            #!/usr/local/bin/perl -w
            use DBI;
            use DBD::DB2::Constants;
            $dbh = DBI->connect("dbi:DB2:sample","","") or
            die “Can't connect to sample database: $DBI::errstr";
            $stmt = "SELECT max(salary) from EMPLOYEE";
            $sth = $dbh->prepare($stmt);
            $sth->execute();
            #associate variable with output columns...
            $sth->bind_col(1,\$max_sal);
            while ($sth->fetch) {
            print "The biggest salary is: $max_sal\n";
            }
            

下面是执行这?Perl E序后的l果Q?/p>
清单 14. 聚合l果?/strong>

            $perl test_return_value.pl
            The biggest salary is: 52750.00
            

从数据库中检索数?—?多个l果

从数据库中返回一个结果集Q即多个l果Q到 Perl E序中的技术与前面所采用的技术非常类伹{在准备q执行返回多个结果的 SQL 语句q将q回|列)l定到本地变量上之后Q可能需要?$sth->fetch Ҏ来检索这些倹{ؓ了展C个方法是如何工作的,下面让我们从 PT_ADDR_BOOK 表中索出 phone ?name 列的内容。清?15 l出了用一个@环来使用 $sth_fetch Ҏ的用法:


清单 15. 从数据库中检索多个?/strong>

            $stmt = "SELECT name, phone from PT_ADDR_BOOK";
            $sth = $dbh->prepare($stmt);
            $sth->execute();
            #associate variables with output columns...
            $sth->bind_col(1,\$name);
            $sth->bind_col(2,\$phone);
            print "NAME                          PHONE      \n";
            print "-------------------------     -----------\n";
            while ($sth->fetch) {
            print $name ;
            print $phone; print "\n";              }
            print "DONE \n";
            $sth->finish();
            

执行q段代码的结果如下:


清单 16. 从数据库中检索多个?/strong>

            C:\Dev_POT\PERL\Labs>perl multi.pl
            NAME                          PHONE
            -------------------------     -----------
            JOHN SMITH               9145556677
            STEVE BROWN          7184358769
            DONE
            

也可以?$sth->fetchrow Ҏ从结果集中检索数据?code>$sth ->fetch Ҏ会将每个g为单独一返回,?$sth ->fetchrow() Ҏ则将一行作Z个数l返回,每列的值都是该数组中的一个元素?

可以使用 fetchrow Ҏ~写功能相同?Perl E序Q如下所C:


清单 17. 从数据库中检索多个?/strong>

            $stmt = "SELECT name, phone from PT_ADDR_BOOK";
            $sth = $dbh->prepare($stmt);
            $sth->execute();
            print "NAME                          PHONE      \n";
            print "-------------------------     -----------\n";
            while (($name, $phone) = $sth->fetchrow())
            { print "$name  $phone\n"; }
            

我们可以?实验 3 开始编写ƈ执行一?Perl E序Q它可以创徏一?DB2 表,向该表中插入一些数据,q返回插入该表中的行数?/p>

调用存储q程

下面让我们来创徏一个多个步骤的场景Q从而详l了解一下如何从 Perl E序中调?DB2 的存储过E。首先,创徏一个简单的存储q程 SP_GET_LOCQ它从表 ORG 中返回某个给定部门的位置Q步?1Q?/p>
清单 18. 步骤 1Q创建存储过E?/strong>

            create procedure sp_get_loc (in deptin int, out loc varchar(13))
            begin
            select location into loc from org where deptnumb = deptin;
            end  @
            

h意,q个存储q程有一个输入参数和一个输出参数。当我们?DB2 的命令行处理器(CLPQ中q行q个q程Ӟ它对部门 10 会返回位|?NEW YORK?


清单 19. 步骤 2Q运行存储过E?/strong>

            $db2 "call sp_get_loc(10,?)"
            Value of output parameters
            --------------------------
            Parameter Name  : LOC
            Parameter Value : New York
            Return Status = 0
            

下面让我们来~写一个简单的 Perl E序来调用存储过E?SP_GET_LOCQ步?3Q请参看 清单 20Q。我们的动?SQL 语句实际上与?DB2 CLP 中执行的语句相同QŞ式ؓ SP_GET_LOC(?,?)Q不q在 CLP 中是传递硬~码?10Q部门编PQ在动?SQL 语句中将使用一个参数标记。采用这U方法,可以对 ORG 表的部门~号列的M值查询位|了?/p>

在构?SQL 语句之后Q剩下的步骤׃其他h参数标记的动态语句完全相同了。可以?$sth = $dbh->prepare Ҏq行准备。?$sth->bind_param Ҏ部门编L定ؓ输入参数Q?$sth->bind_param_inout Ҏ返回的位置l定出参敎ͼ然后再执行动?SQL 语句?/p>

该程序如下:


清单 20. 步骤 3Q调用存储过E?/strong>

            #!/usr/bin/perl -w
            use DBI;
            use DBD::DB2::Constants;
            $dbh = DBI->connect("dbi:DB2:sample","","") or
            die "Can't connect to sample database: $DBI::errstr";
            # Prepare our call statement
            $sth = $dbh->prepare( "CALL SP_GET_LOC(?,?)" );
            # Bind input parameter for department number
            $sth->bind_param(1, 10);
            # Bind output parameter - location
            $sth->bind_param_inout (2, \$location, 13,     db2_param_type=>SQL_PARAM_OUTPUT});
            # Call the stored procedure
            $sth->execute();
            printf("Stored procedure returned location: %s\n", $location);
            $sth->finish();
            $dbh->disconnect;
            

如果执行q个E序Q就会看到给定部门(本例中ؓ 10Q的 LOCATIONQ?


清单 21. 步骤 4Q执行调?DB2 存储q程?Perl E序

            $perl test_call_sp.pl
            Stored Procedure returned location: New York
            

大对象的操作

使用 Perl 来处理文件比使用其他更复杂的语言Q例?C ?Java®Q都要简单。下面我们就会看到如何将数据直接从文件中导入 DB2 的大对象数据QLOBQ列中。插入大对象数据的最有效的方法是Q将q个文g直接l定?DB2 表中一个与 LOB cd的列相关联的输入参数上。Perl 驱动E序可以直接从文件中d数据Qƈ数据传递给数据库服务器。要一个文件绑定到某个输入 LOB 参数上,可以在执?INSERT 操作q程中?bind_param Ҏ来指?{ db2_file => 1} 参数属性?/p>

在我们的数据库模?POT 下面有一个表 MAP。这个表有一?picture 列,它被声明?BLOB cd的,用来存放某个地区的图像。下面是创徏该表所使用?DDLQ?/p>
清单 22. 创徏 MAP 表用的 DDL

            create table POT.MAPS
            ( map_id           INT,
            map_name     VARCHAR(13),
            area                 INT ,
            photo_format CHAR(3),
            picture            BLOB) ;
            

另外Q我们还有一个文?pearcson.jpgQ其中包含了 Pearson Airport 的地图?


?3. CZ地图
CZ地图

现在让我们来~写一个程序,向表 POT.MAP 中插入一行数据,卛_ JPG 文g的图像插入到 PICTURE 中。首先,需要构造一个具?5 个参数标记的动?SQL 语句。然后,需要对q条语句q行准备。在参数绑定到准备好的语句上之前,需要指定包含要插入的图像的文g名,q将其赋l一个本?Perl 变量Q?code>$picture_fileQ。现在可以将所有参数全部绑定到需要插入到 MAP 表中的g。请注意Q我们ؓ最后一个参数指定了 db2_file =>1 属性。最后一个步骤是执行q条 INSERT 语句。这个程序的代码如下Q?/p>
清单 23. 插入 LOB

            #!/usr/bin/perl -w
            use DBI;
            use DBD::DB2::Constants;
            %conattr = (   AutoCommit             => 1,
            # Turn Autocommit On
            db2_info_applname  => 'Maps Module', );
            # Identify this appl
            $dbh = DBI->connect("dbi:DB2:sample","", "",\%conattr) or die "$DBI::errstr";
            $dbh->do("SET CURRENT SCHEMA POT");
            $sql = "INSERT INTO MAPS(map_id, map_name, area, photo_format, picture)
            VALUES(?,?,?,?,?)";
            $sth = $dbh->prepare($sql);
            $picture_file = "pearson.jpg";           # File containing our picture
            $sth->bind_param(1, 100);                # map_id
            $sth->bind_param(2, "Pearson airport");  # map_name
            $sth->bind_param(3, 416);                # area
            $sth->bind_param(4, "JPG");              # photo_format
            $sth->bind_param(5, $picture_file, {db2_file => 1});
            $rows_affected = $sth->execute();
            printf("%d rows affected", $rows_affected);
            $sth->finish();
            $dbh->disconnect;
            

从数据库中读?LOB 数据

可以使用标准?fetch Ҏ来检?LOB 数据Q例?fetchrow_array ?fetchrow_arrayref。DBI 让我们可以?LongReadLen q接属性来讄每次 fetch 可以索的最大字节数。对?LOB 列来_~省gؓ 32,700 个字节。要实现q种功能Q需要执行以下步骤:

  1. 构?SQL 语句?MAP 表中选择 picture 列的数据?
  2. 准备 SQL 语句?
  3. Z存所索到的图像用的文g分配一个名字?
  4. 打开该文件?
  5. 执行q条 SQL 语句?
  6. 使用 fetch Ҏ结果取到文件中?/li>

下面是展C如何从数据库中?LOB 数据的代码:


清单 24. 从数据库中读?LOB 数据

            #!/usr/bin/perl
            use DBI;
            use DBD::DB2::Constants;
            %conattr =
            (
            AutoCommit             => 1,
            # Turn Autocommit On
            db2_info_applname  => 'Maps Module',
            # Identify this appl
            LongReadLen           => 80000
            # Don't retrieve LOBs
            );
            # Connect to our database
            $dbh = DBI->connect("dbi:DB2:sample","", "",\%conattr) or
            die "$DBI::errstr";
            # Set the current schema to 'POT'
            $dbh->do("SET CURRENT SCHEMA POT");
            $sql = "SELECT picture FROM maps WHERE map_name ='Pearson airport'";
            # Prepare the statement
            $sth = $dbh->prepare($sql);
            # Open output file
            $out_file = "mypic.jpg";
            open(OUTPUT, ">$out_file") or die "Cannot open $out_file because $!";
            binmode OUTPUT;
            $sth->execute;
            @row = $sth->fetchrow;
            print OUTPUT $row[0];
            @row = "";
            close(OUTPUT);
            print “Picture in the file $out_file\n";
            $sth->finish();
            $dbh->disconnect;
            

在运行这个程序之后,囑փ׃存到 mypic.jpg 文g中了?/p>
清单 25. 从数据库中读?LOB 数据

            $perl test_lobread.pl
            Picture in the file mypic.jpg
            

请?实验 4 中的l习来编写ƈ执行一?Perl E序Q它从一个表中检索出二进制大对象Qƈ其保存C个文件中?/p>

l束?/span>

本文是ؓ那些h关系数据库经验ƈ且希望学习如何编?Perl E序来访?DB2 数据库的 Perl E序员编写的。在本文中,我们已经学习了如何连接数据库Q如何通过 INSERT、UPDATE ?DELETE 语句来操作数据库的内宏V还学习了如何从数据库中索数据,q介l了一些高U主题,包括调用存储q程和操作大数据对象QLOB ?BLOBQ。现在我们应该已l准备好使用自己刚掌握的 Perl DB2 ~程技巧来开发自qE序了?

原文链接Q?a target=_blank>http://www-128.ibm.com/developerworks/cn/db2/library/techarticles/dm-0512greenstein/index.html



Prayer 2010-01-21 11:34 发表评论
]]>
һaɫƬþٸһHƬѷ| þAVӰ| þ߿ۿƷ㽶| ɫۺϾþۺ| þù| ޾þþһ | þԾƷ| ޼VëƬþþƷ| þþݾþþ| ˺ݺۺϾþ޸| þۺϾþ߾Ʒ| 99þѹƷ| ɫۺϾþĻ| þþþù| þŮƵ| 㽶þҹɫƷ| þҹɫ˾Ʒ| ۲ӰԺþùƷ| ݺɫþþۺƵպ| þ99Ʒþþþþ| Ʒþþþþר| ŷ˾þô߽ۺ| þþƷ| ۲ӰԺþ99| ƷƵþþ| AVպƷþþþþ | þ߿ۿƷ㽶| þþþþùƷŮ | Ӱһþþþó˾Ʒۺ | ɫۺϾþþþ| ޾Ʒþþþþ| ޳˾Ʒþ| þþþһ| þõӰ| Ӱһþþþó˾Ʒۺ | ƷþþþùA| ޾ƷŮþþ| ղƷ99þþþþ| þþþAvר| 99þҹɫƷվ| 㽶þþƷ|