<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title><![CDATA[飞鸟的天空 - Perl资料]]></title>
<link>http://www.cmuch.com/</link>
<description><![CDATA[What you are you do not see,What you see is your shadow.]]></description>
<language>zh-cn</language>
<copyright><![CDATA[Copyright 2005 PBlog3 v2.8]]></copyright>
<webMaster><![CDATA[cn_vipus@yahoo.com.cn(cn_vipus)]]></webMaster>
<generator>PBlog2 v2.4</generator> 
<image>
	<title>飞鸟的天空</title>
	<url>http://www.cmuch.com/images/logos.gif</url>
	<link>http://www.cmuch.com/</link>
	<description>飞鸟的天空</description>
</image>

			<item>
			<link>http://www.cmuch.com/article.asp?id=206</link>
			<title><![CDATA[Failed to determine directory of mysql.h.....]]></title>
			<author>cn_vipus@yahoo.com.cn(cn_vipus)</author>
			<category><![CDATA[Perl资料]]></category>
			<pubDate>Tue,18 Mar 2008 00:15:05 +0800</pubDate>
			<guid>http://www.cmuch.com/default.asp?id=206</guid>
		<description><![CDATA[状态:<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.cmuch.com/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>安装DBD::mysql模块时<br/>Perl: 5.8.6<br/>shell&gt; perl -MCPAN -e shell<br/>cpan&gt; install DBI<br/>................<br/>cpan&gt; install DBD::mysql<br/>提示错误信息，like this:<br/>......<br/>CPAN.pm: Going to build C/CA/CAPTTOFU/DBD-mysql-4.005.tar.gz<br/><br/>Can&#39;t exec &#34;mysql_config&#34;: No such file o&#114; directory at Makefile.PL line 76.<br/><br/>Cannot find the file &#39;mysql_config&#39;! Your execution PATH doesn&#39;t seem<br/>not contain the path to mysql_config. Resorting to guessed values!<br/>Can&#39;t exec &#34;mysql_config&#34;: No such file o&#114; directory at Makefile.PL line 466.<br/>Can&#39;t exec &#34;mysql_config&#34;: No such file o&#114; directory at Makefile.PL line 466.<br/>Can&#39;t exec &#34;mysql_config&#34;: No such file o&#114; directory at Makefile.PL line 466.<br/>Can&#39;t exec &#34;mysql_config&#34;: No such file o&#114; directory at Makefile.PL line 466.<br/>Can&#39;t exec &#34;mysql_config&#34;: No such file o&#114; directory at Makefile.PL line 466.<br/>Can&#39;t exec &#34;mysql_config&#34;: No such file o&#114; directory at Makefile.PL line 466.<br/>Failed to determine directory of mysql.h. Use<br/><br/>perl Makefile.PL --cflags=-I&lt;dir&gt;<br/>to set this directory. For details see the INSTALL.html file,<br/>section &#34;C Compiler flags&#34; o&#114; type<br/><br/>perl Makefile.PL --help <br/></div></div><br/><br/>我在Debian系统上安装perl的DBD::mysql遇到这个问题,因为本机没有安装mysql,所以mysql支持的库文件也没有安装:<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.cmuch.com/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>#aptitude install libmysql++-dev&nbsp;&nbsp;libmysql++2c2a<br/></div></div>]]></description>
		</item>
		
			<item>
			<link>http://www.cmuch.com/article.asp?id=204</link>
			<title><![CDATA[用perl将url中的汉字转换成ascii的16进制字符串]]></title>
			<author>cn_vipus@yahoo.com.cn(cn_vipus)</author>
			<category><![CDATA[Perl资料]]></category>
			<pubDate>Wed,12 Mar 2008 17:51:19 +0800</pubDate>
			<guid>http://www.cmuch.com/default.asp?id=204</guid>
		<description><![CDATA[如将:<a href="http://php.weather.sina.com.cn/search.php?city=" target="_blank" rel="external">http://php.weather.sina.com.cn/search.php?city=</a>北京<br/>转换为:<a href="http://php.weather.sina.com.cn/search.php?city=" target="_blank" rel="external">http://php.weather.sina.com.cn/search.php?city=</a>%B1%B1%BE%A9<br/>&#34;北京&#34;的ascii码16进制是&#34;B1B1BEA9&#34;<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.cmuch.com/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>use Encode qw(from_to);<br/>$string=&#34;北京&#34;;<br/>from_to($string, &#34;utf8&#34;, &#34;GB2312&#34;);&nbsp;&nbsp;&nbsp;&nbsp;#需要你自己根据编码改一下 <br/>$string=~s/(\W)/sprintf(&#34;%%%02X&#34;,unpack(&#34;C&#34;,$1))/eg;<br/>print $string;<br/></div></div>]]></description>
		</item>
		
			<item>
			<link>http://www.cmuch.com/article.asp?id=197</link>
			<title><![CDATA[将系统命令的输出做为perl的变量]]></title>
			<author>cn_vipus@yahoo.com.cn(cn_vipus)</author>
			<category><![CDATA[Perl资料]]></category>
			<pubDate>Fri,11 Jan 2008 10:39:15 +0800</pubDate>
			<guid>http://www.cmuch.com/default.asp?id=197</guid>
		<description><![CDATA[<br/>1.如:在perl脚本中,想将linux下的pwd命令赋值给变量<br/><br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.cmuch.com/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>my $path = `cwd`;<br/></div></div>]]></description>
		</item>
		
			<item>
			<link>http://www.cmuch.com/article.asp?id=195</link>
			<title><![CDATA[我收集的PERL部分电子书]]></title>
			<author>cn_vipus@yahoo.com.cn(cn_vipus)</author>
			<category><![CDATA[Perl资料]]></category>
			<pubDate>Tue,08 Jan 2008 10:23:24 +0800</pubDate>
			<guid>http://www.cmuch.com/default.asp?id=195</guid>
		<description><![CDATA[<span style="font-size:10pt"><br/>1.Perl语言入门(第四版).pdf<br/><img src="http://www.cmuch.com/images/download.gif" alt="下载文件" style="margin:0px 2px -4px 0px"/> <a href="http://www.cmuch.com/attachments/month_0801/s200818102146.pdf" target="_blank">点击下载此文件</a><br/><br/>2.Perl 语言编程.chm<br/><img src="http://www.cmuch.com/images/download.gif" alt="下载文件" style="margin:0px 2px -4px 0px"/> <a href="http://www.cmuch.com/attachments/month_0801/4200818102313.chm" target="_blank">点击下载此文件</a><br/><br/>3.Programming_the_Perl_DBI.chm<br/><img src="http://www.cmuch.com/images/download.gif" alt="下载文件" style="margin:0px 2px -4px 0px"/> <a href="http://www.cmuch.com/attachments/month_0801/9200818102515.chm" target="_blank">点击下载此文件</a><br/><br/>4.Perl_Database_programming.chm<br/><img src="http://www.cmuch.com/images/download.gif" alt="下载文件" style="margin:0px 2px -4px 0px"/> <a href="http://www.cmuch.com/attachments/month_0801/q200818102625.chm" target="_blank">点击下载此文件</a><br/><br/></span>]]></description>
		</item>
		
			<item>
			<link>http://www.cmuch.com/article.asp?id=190</link>
			<title><![CDATA[Perl Unicode全攻略]]></title>
			<author>cn_vipus@yahoo.com.cn(cn_vipus)</author>
			<category><![CDATA[Perl资料]]></category>
			<pubDate>Fri,28 Dec 2007 17:04:00 +0800</pubDate>
			<guid>http://www.cmuch.com/default.asp?id=190</guid>
		<description><![CDATA[<span style="font-size:10pt"><br/><br/>耐心看完本文, 相信你今后在unicode处理上不会再有什么问题.<br/><br/>本文内容适用于perl 5.8及其以上版本.<br/><br/>perl internal form<br/><br/>在Perl 看来, 字符串只有两种形式. 一种是octets, 即8位序列, 也就是我们通常说的字节数组. 另一种utf8编码的字符串, perl管它叫string. 也就是说: Perl只认识两种编码: Ascii(octets)和utf8(string).<br/><br/>utf8 flag<br/><br/>那么perl如何确定一个字符串是octets还是utf8编码的字符串呢? perl可没有什么智能, 他完全是靠字符串上的utf8 flag. 在perl内部, 字符串结构由两部分组成: 数据和utf8 flag. 比如字符串&#34;中国&#34;在perl内部的存储是这样:<br/><br/>utf8 flag&nbsp;&nbsp; 数据<br/>On&nbsp;&nbsp;中国<br/><br/>如果utf8 flag是On的话, perl就会把中国当成utf8字符串来处理, 如果utf8 flag为Off, perl就会把他当成octets来处理. 所有字符串相关的函数包括正则表达式都会受utf8 flag的影响. 让我们来看个例子:<br/><br/>程序代码:<br/>use Encode;<br/>use strict;<br/><br/>my $str = &#34;中国&#34;;<br/>Encode::_utf8_on($str);<br/>print length($str) . &#34;\n&#34;;<br/>Encode::_utf8_off($str);<br/>print length($str) . &#34;\n&#34;;<br/><br/>运行结果是:<br/><br/>程序代码:<br/>2<br/>6<br/><br/>这里我们使用Encode模块的_utf8_on函数和_utf8_off函数来开关字符串&#34;中国&#34;的utf8 flag. 可以看到, utf8 flag打开的时候, &#34;中国&#34;被当成utf8字符串处理, 所以其长度是2. utf8 flag关闭的时候, &#34;中国&#34;被当成octets(字节数组)处理, 出来的长度是6(我的编辑器用的是utf8编码, 如果你的编辑器用的是gb2312编码, 那么长度应该是4).<br/><br/>再来看看正则表达式的例子:<br/><br/>程序代码:<br/>use Encode;<br/>use strict;<br/><br/>my $a = &#34;china----中国&#34;;<br/>my $b = &#34;china----中国&#34;;<br/>Encode::_utf8_on($a);<br/>Encode::_utf8_off($b);<br/>$a =~ s/\W+//g;<br/>$b =~ s/\W+//g;<br/>print $a, &#34;\n&#34;;<br/>print $b, &#34;\n&#34;;<br/><br/>运行结果:<br/><br/>程序代码:<br/>Wide character in print at unicode.pl line 10.<br/>china中国<br/>china<br/><br/>结果第一行是一条警告, 这个我们稍后再讨论. 结果的第二行说明, utf8 flag开启的情况下, 正则表达式中的\w能够匹配中文, 反之则不能.<br/><br/>如何确定一个字符串的utf8 flag是否已开启? 使用Encode::is_utf8($str). 这个函数并不是用来检测一个字符串是不是utf8编码, 而是仅仅看看它的utf8 flag是否开启.<br/><br/>eq<br/><br/>eq是一个字符串比较操作符, 只有当字符串的内容一致并且utf8 flag的状态也是一致的时候, eq才会返回真.<br/><br/>理论就是上面这些, 一定要搞明白, 记清楚! 下面是实际应用.<br/><br/>unicode转码<br/><br/>如果你有一个字符串&#34;中国&#34;, 它是gb2312编码的. 如果它的utf8 flag是关闭的, 它就会被当成octets来处理, length()会返回4, 这通常不是你想要的. 而如果你开启它的utf8 flag, 则它会被当做utf8编码的字符串来处理. 由于它本来的编码是gb2312的, 不是utf8的, 这就可能导致错误发生. 由于gb2312和utf8内码范围部分重叠, 所以很多时候, 不会有错误报出来, 但是perl可能已经错误地拆解了字符. 严重的时候, perl会报警, 说某个字节不是合法的utf8内码.<br/><br/>解决的方法很显然, 如果你的字符串本来不是utf8编码的, 应该先把它转成utf8编码, 并且使它的utf8 flag处于开启状态. 对于一个gb2312编码的字符串, 你可以使用<br/><br/>程序代码:<br/>$str = Encode::decode(&#34;gb2312&#34;, $str);<br/><br/>来将其转化为utf8编码并开启utf8 flag. 如果你的字符串编码本来就是utf8, 只是utf8 flag没有打开, 那么你可以使用以下三种方式中的任一种来开启utf8 flag:<br/><br/>程序代码:<br/>$str = Encode::decode_utf8($str);<br/>$str = Encode::decode(&#34;utf8&#34;, $str);<br/>Encode::_utf8_on($str);<br/><br/>最后一种方式效率最高, 但是官方不推荐. 以下划线开头的函数是内部函数, 出于礼貌, 一般不从外部调用.<br/><br/>字符串连接<br/><br/>. 是字符串连接操作符. 连接两个字符串时, 如果两个字符串的utf8 flag都是Off, 那么结果字符串也是Off. 如果其中任何一个字符串的utf8 flag是On的话, 那么结果字符串的utf8 flag将是On. 连接字符串并不会改变它们原来的编码, 所以如果你把两个不同编码的字符串连在一起, 那么以后不管对这个字符串怎么转码, 都总会有一段是乱码. 这种情况一定要避免, 连接两个字符串之前应该确保它们编码一致. 如有必要, 先进行转码, 再连接字符串.<br/><br/>perl unicode编程基本原则<br/><br/>对于任何要处理的unicode字符串, 1)把它的编码转换成utf8; 2)开启它的utf8 flag<br/><br/>字符串来源<br/><br/>为了应用上面说到的基本原则, 我们首先要知道字符串本来的编码和utf8 flag开关情况, 这里我们讨论几种情况.<br/><br/>1) 命令行参数和标准输入. 从命令行参数或标准输入(STDIN)来的字符串, 它的编码跟locale有关. 如果你的locale是zh_CN或zh_CN.gb2312, 那么进来的字符串就是gb2312编码, 如果你的locale是zh_CN.gbk, 那么进来的编码就是gbk, 如果你的编码是zh_CN.UTF8, 那进来的编码就是utf8. 不管是什么编码, 进来的字符串的utf8 flag都是关闭的状态.<br/><br/>2) 你的源代码里的字符串. 这要看你编写源代码时用的是什么编码. 在editplus里, 你可以通过&#34;文件&#34;-&gt;&#34;另存为&#34;查看和更改编码. 在linux下, 你可以cat一个源代码文件, 如果中文正常显示, 说明源代码的编码跟locale是一致的. 源代码里的字符串的utf8 flag同样是关闭的状态.<br/><br/>如果你的源代码里含有中文, 那么你最好遵循这个原则: 1) 编写代码时使用utf8编码, 2)在文件的开头加上use utf8;语句. 这样, 你源代码里的字符串就都会是utf8编码的, 并且utf8 flag也已经打开.<br/><br/>3) 从文件读入. 这个毫无疑问, 你的文件是什么编码, 读进来就是什么编码了. 读进来以后, utf8 flag是off状态.<br/><br/>4) 抓取网页. 网页是什么编码就是什么编码, utf8 flag是off状态. 网站的编码可以从响应头里或者html的&lt;head&gt;标签里获得. 也有可能出现响应头和html head里都没说明编码的情况, 这个就是做的很不礼貌的网页了. 这时候只能用程序来猜:<br/><br/>程序代码:<br/>use Encode;<br/>use LWP::Simple qw(get);<br/>use strict;<br/><br/>my $str = get &#34;<a href="http://www.sina.com.cn" target="_blank" rel="external">http://www.sina.com.cn</a>&#34;;<br/><br/>eval {my $str2 = $str; Encode::decode(&#34;gbk&#34;, $str2, 1)};<br/>print &#34;not gbk: $@\n&#34; if $@;<br/><br/>eval {my $str2 = $str; Encode::decode(&#34;utf8&#34;, $str2, 1)};<br/>print &#34;not utf8: $@\n&#34; if $@;<br/><br/>eval {my $str2 = $str; Encode::decode(&#34;big5&#34;, $str2, 1)};<br/>print &#34;not big5: $@\n&#34; if $@;<br/><br/>输出:<br/><br/>程序代码:<br/>not utf8: utf8 &#34;\xD0&#34; does not map to Unicode at /usr/local/lib/perl/5.8.8/Encode.pm line 162.<br/><br/>not big5: big5-eten &#34;\xC8&#34; does not map to Unicode at /usr/local/lib/perl/5.8.8/Encode.pm line 162.<br/><br/>我们给decode函数传递了第三个参数, 要求有异常字符的时候报错. 我们用eval捕获错误, 转码失败说明字符串本来不是这种编码. 另外注意我们每次都把$str拷贝到$str2, 这是因为decode第三个参数为1时, decode以后, 传给它的字符串参数(第二个参数会被清空). 我们拷贝一下, 这样每次被清空的都是$str2, $str不变.<br/><br/>来看结果, 既然不是utf8, 也不是big5, 那就应该是gbk了. 对于其他不知编码的字符串, 也可以使用这种方法来猜. 不过因为几种编码的内码范围都差不多, 所以如果字符串比较短, 就可能出不了异常字符, 所以这个方法只适用于大段的文字.<br/><br/>输出<br/><br/>字符串在程序内被正确地处理后, 要展现给用户. 这时我们需要把字符串从perl internal form转化成用户能接受的形式. 简单地说, 就是把字符串从utf8编码转换成输出的编码或表现界面的编码. 这时候, 我们使用$str = Encode::encode(&#39;charset&#39;, $str);. 同样可以分为几种情况.<br/><br/>1) 标准输出. 标准输出的编码跟locale一致. 输出的时候utf8 flag应该关闭, 不然就会出现我们前面看到的那行警告:<br/><br/>程序代码:<br/>Wide character in print at unicode.pl line 10.<br/><br/>2) GUI程序. 这个应该是不用干什么, utf8编码, utf8 flag开启就行. 没有实际测试过.<br/><br/>3) 做http post. 看网页表单要求什么编码. utf8 flag开或关无所谓, 因为http post发送出去的只是字符串中的数据部分, 不管utf8 flag.<br/><br/>PerlIO<br/><br/>PerlIO为我们的输入/输出转码提供了便利. 它可以针对某个文件句柄, 输入的时候自动帮你转码并开启utf8 flag, 输出的时候, 自动帮你转码并关闭utf8 flag. 假设你的终端locale是gb2312, 看下面的例子:<br/><br/>程序代码:<br/>use strict;<br/>binmode(STDIN, &#34;:encoding(gb2312)&#34;);<br/>binmode(STDOUT, &#34;:encoding(gb2312)&#34;);<br/>while (&lt;&gt;) {<br/>chomp;<br/>print $_, length, &#34;\n&#34;;<br/>}<br/><br/>运行后输入&#34;中国&#34;, 结果:<br/><br/>程序代码:<br/>中国2<br/><br/>这样我们就省去了输入和输出时转码的麻烦. PerlIO可以作用于任何文件句柄, 具体请参考perldoc PerlIO.<br/><br/>相关API<br/><br/>都是Encode模块的:<br/><br/>$octets = encode(ENCODING, $string [, CHECK]) 把字符串从utf8编码转成指定的编码, 并关闭utf8 flag.<br/><br/>$string = decode(ENCODING, $octets [, CHECK]) 把字符串从其他编码转成utf8编码, 并开启utf8 flag, 不过有个例外就是, 如果字符串是仅仅ascii编码或EBCDIC编码的话, 不开启utf8 flag.<br/><br/>is_utf8(STRING [, CHECK]) 看看utf8 flag是否开启. 如果第二个参数为真, 则同时检查编码是否符合utf8. 这个检测不一定准确, 跟decode方式检测效果一样.<br/><br/>_utf8_on(STRING) 打开字符串的utf flag<br/><br/>_utf8_off(STRING) 关闭字符串的utf flag<br/><br/>最后两个是内部函数, 不推荐使用.<br/><br/>参考perldoc Encode.<br/><br/>utf8和utf-8<br/><br/>前面我们提到的一直都是utf8. 在perl中, utf8和utf-8是不一样的. utf-8是指国际上标准的utf-8定义, 而utf8是perl在国际标准上做了一些扩展, 能兼容的内码要比国际标准的多一些. perl internal form使用的是utf8. 另外顺便提一下, 字符集的名称是不区分大小写的并且&#34;_&#34;和&#34;-&#34;是等价的.<br/><br/>EBCDIC<br/><br/>EBCDIC是一套遗留的宽字符解决方案, 不同于unicode, 它不是Ascii的超集. 上面介绍的方案并不完全适用于EBCDIC. 关于EBCDIC, 请参考perldoc perlebcdic.<br/></span>]]></description>
		</item>
		
			<item>
			<link>http://www.cmuch.com/article.asp?id=175</link>
			<title><![CDATA[用Perl生成随机密码]]></title>
			<author>cn_vipus@yahoo.com.cn(cn_vipus)</author>
			<category><![CDATA[Perl资料]]></category>
			<pubDate>Mon,05 Nov 2007 14:19:21 +0800</pubDate>
			<guid>http://www.cmuch.com/default.asp?id=175</guid>
		<description><![CDATA[<span style="font-size:10pt">如果你是一名系统管理员或者Web开发人员，你可能已经知道强度不够的用户密码是最大网络安全风险之一。强度不够的密码——比如，使用用户的名字或者生日作密码——通常都可以利用复杂的用户嗅探工具“破解”，这样未经授权的用户就可以很容易地从后门进入服务器。这就是为什么很多管理员都会定期检查用户密码，以确保它们的安全性足以抵御住一次进攻。根据所需要的安全级别，有一些管理员甚至会对密码进行进一步的处理：他们会自己生成并指定用户密码。<br/><br/>但是，自动地生成用户密码有些棘手——密码必须足够简单，容易记住，但是又不能太简单，否则就很容易被破解。Internet上有很多算法可以用来帮助你生成一个安全的、可以拼读的密码；然而，如果你交工的最终期限即将到来，或者你没有多少开发经验，你并不是总是能够实现这些解决方案。<br/><br/>但是，现在就有一个解决方案。CPAN有很多自动生成密码的模块，能够让你轻松地在应用程序里加入这项功能。这些模块都是很先进的工具——你可以自定义密码的长度、允许输入的字符、最终密码的“可拼读性”，以及其他属性。这类模块中有两个很有意思，我们下面就要讨论它们。<br/><br/>The String::MkPasswd模块<br/><br/>String::MkPasswd模块提供了一个简单的API，用来随机生成不可拼读的密码。要在Perl里使用它，就要进行下面这些步骤：<br/><br/>1. 安装这个模块<br/><br/>安装String::MkPasswd的最简单方法是使用CPAN命令解释器，输入下面的命令：<br/><br/>shell&gt; perl -MCPAN -e shell<br/>cpan&gt; install String::MkPasswd<br/><br/>如果使用CPAN命令解释器，那么相关性就会被自动下载。<br/><br/>或者，你可以下载这个模块。一旦把下载文档里的文件解压到临时目录里，你就要运行下面这些命令：<br/><br/>shell&gt; perl Makefile.PL<br/>shell&gt; make<br/>shell&gt; make install<br/><br/>如果Perl发现有相关性丢失，它会中断这一过程，并显示错误；那么你就应该安装丢失的文件并重试。如果所需要的文件都有了，那么上面的命令就会被编译，并把这个模块安装到你的Perl模块目录下。<br/><br/>2. 确定密码的属性<br/><br/>在编写代码之前，你必须确定密码的一些重要属性。String::MkPasswd让你可以控制：<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;* 密码的长度；<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 数字的数量；<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 大写和小写字符的数量；<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 特殊标点符号的数量；<br/><br/>在大多数情况下，你希望密码有8到15个字符长，而且希望一般的字符中间还包含相当的数字和特殊字符。要记住的是，密码越随机，它就越难被破解！<br/><br/>3. 生成密码<br/><br/>一旦确定密码需要是什么样的，你就可以调用String::MkPasswd模块的mkpasswd()函数来生成密码，见列表A。<br/><br/>列表A<br/><br/>#!/bin/perl<br/><br/># import module<br/>use String::MkPasswdqw(mkpasswd);<br/><br/># print custom password<br/>print mkpasswd(-length =&gt; 13, -minnum =&gt; 4, -minlower =&gt; 4, -minupper =&gt; 2, -minspecial =&gt; 3);<br/><br/>在本文里，所生成的密码有13个字符长，其中包括4个数字、4个小写字符、2个大写字符和3个标点。下面就是一个输出的例子：<br/><br/>w)d9V;7kz64&amp;Y<br/><br/>每次调用mkpasswd()的时侯，你会得到一个不同的结果。所以，如果有大量的密码要生成，你可以就把对mkpasswd()的调用放到一个循环里，并处理每次运行的结果。<br/><br/>提示：如果这看起来太麻烦，你还可以不使用任何参数就调用mkpasswd()生成一个默认的9位数的密码。<br/><br/>Crypt::RandPasswd模块<br/><br/>String::MkPasswd模块可以生成很安全但是非常难以记住的密码。如果你更希望生成可以拼读和容易记忆的密码，那就考虑Crypt::RandPasswd模块吧。这个模块是自动密码生成器（Automated Password Generator）的一个实现，你可以用下面的步骤来使用它：<br/><br/>1. 安装这个模块<br/><br/>你可以用CPAN命令解释器来安装Crypt::RandPasswd，就像下面这样：<br/><br/>shell&gt; perl -MCPAN -e shell<br/>cpan&gt; install Crypt::RandPasswd<br/><br/>或者，可以下载这个模块，并用下面的命令来安装它：<br/><br/>shell&gt; perl Makefile.PL<br/>shell&gt; make<br/>shell&gt; make install<br/><br/>2. 生成密码<br/><br/>Crypt::RandPasswd模块带有一个word()函数，用来生成可拼读的随机密码。列表B是如何使用它的例子。<br/><br/>列表B<br/><br/>#!/bin/perl<br/><br/># use module<br/>use Crypt::RandPasswd;<br/><br/># generate password<br/>$word = Crypt::RandPasswd-&gt;word(5, 10);<br/>print $word;<br/><br/>word()函数接受两个自变量：密码长度的上限和下限。下面就是输出结果的一个例子：<br/><br/>ijantyoph<br/><br/>提示：通过调用letters()方法你可以生成一个含有一串随机字母字符的密码，而不需要使用words()方法。</span>]]></description>
		</item>
		
			<item>
			<link>http://www.cmuch.com/article.asp?id=162</link>
			<title><![CDATA[Perl FTP 实践 脚本]]></title>
			<author>cn_vipus@yahoo.com.cn(cn_vipus)</author>
			<category><![CDATA[Perl资料]]></category>
			<pubDate>Thu,30 Aug 2007 09:16:54 +0800</pubDate>
			<guid>http://www.cmuch.com/default.asp?id=162</guid>
		<description><![CDATA[<div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.cmuch.com/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>#!/usr/bin/perl<br/>use Net::FTP;<br/>$ftp = Net::FTP-&gt;new(&#34;ftp.digital.com&#34;);<br/>die &#34;Could not connect: $!&#34; unless $ftp;<br/>$ftp-&gt;login(&#39;anonymous&#39;, &#39;me@foo.com&#39;);&nbsp;&nbsp;# Guest User; email as passwd<br/>$ftp-&gt;cwd(&#39;/pub/doc&#39;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# cwd:Change Working Directory<br/>$ftp-&gt;get(&#39;telecom.glossary.txt&#39;);<br/>$ftp-&gt;quit();<br/><br/></div></div>]]></description>
		</item>
		
			<item>
			<link>http://www.cmuch.com/article.asp?id=158</link>
			<title><![CDATA[如何用Net::SMTP发送邮件]]></title>
			<author>cn_vipus@yahoo.com.cn(cn_vipus)</author>
			<category><![CDATA[Perl资料]]></category>
			<pubDate>Tue,28 Aug 2007 10:38:20 +0800</pubDate>
			<guid>http://www.cmuch.com/default.asp?id=158</guid>
		<description><![CDATA[<span style="font-size:10pt"><br/>如下代码为用163.com的SMTP来发送邮件。<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.cmuch.com/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>#!/usr/bin/perl<br/>use Net::SMTP;<br/><br/>my $mailhost = &#34;smtp.163.com&#34;; # the smtp host<br/>my $mailfrom = &#39;notfour@163.com&#39;; # your email address<br/>my @mailto = (&#39;fayland@gmail.com&#39;, &#39;not_four@hotmail.com&#39;); # the recipient list<br/>my $subject = &#34;此为标题&#34;;<br/>my $text = &#34;此为正文\n第二行位于此。&#34;;<br/><br/>$smtp = Net::SMTP-&gt;new($mailhost, Hello =&gt; &#39;localhost&#39;, Timeout =&gt; 120, Debug =&gt; 1);<br/><br/># anth login, type your user name and password here<br/>$smtp-&gt;auth(&#39;user&#39;,&#39;pass&#39;);<br/><br/>foreach my $mailto (@mailto) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;# Send the From and Recipient for the mail servers that require it<br/>&nbsp;&nbsp;&nbsp;&nbsp;$smtp-&gt;mail($mailfrom);<br/>&nbsp;&nbsp;&nbsp;&nbsp;$smtp-&gt;to($mailto);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;# Start the mail<br/>&nbsp;&nbsp;&nbsp;&nbsp;$smtp-&gt;data();<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;# Send the header<br/>&nbsp;&nbsp;&nbsp;&nbsp;$smtp-&gt;datasend(&#34;To: $mailto\n&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;$smtp-&gt;datasend(&#34;From: $mailfrom\n&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;$smtp-&gt;datasend(&#34;Subject: $subject\n&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;$smtp-&gt;datasend(&#34;\n&#34;);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;# Send the message<br/>&nbsp;&nbsp;&nbsp;&nbsp;$smtp-&gt;datasend(&#34;$text\n\n&#34;);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;# Send the termination string<br/>&nbsp;&nbsp;&nbsp;&nbsp;$smtp-&gt;dataend();<br/>}<br/>$smtp-&gt;quit;<br/></div></div><br/>TroubleShooting/Code Analysis<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;* 为什么要 $stmp-&gt;auth(&#39;user&#39;,&#39;pass&#39;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;大部分SMTP服务器为了防止 spam /垃圾邮件，就需要用户验证身份。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;此方法需要另外安装模块：Authen::SASL, 此模块可能系统不自带。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果系统为虚拟主机，而此模块无法安装，可使用Socket模块进行最直接的操作。详细的代码可以参考脚本LeoBBS或书籍《Perl网络编程》。<br/>&nbsp;&nbsp;&nbsp;&nbsp;* Debug =&gt; 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;此段代码用于测试之用，所以开启了Debug，一般测试一次完毕，正式使用的话会关闭它。<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 需要注意的是发信人和收信人的地址要用单引号，或者用&#34;fayland\@gmail.com&#34;。如果是个变量，需要用正则先将其转换。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$mailto =~ s/\@/\\\@/;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;* 我想发送附件，该如何做？<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;参考《Perl网络编程》。<br/><br/>邮件发送过程的简单介绍<br/>SMTP协议由文档rfc821定义。<br/>在rfc821协议中定义了两个角色，即发送者（用S表示，指发送邮件的程序）和接收者（用R表示，指SMTP服务器）。<br/>&nbsp;&nbsp; 1. 在 S 和 R 通过套接连接后，S应当先向R表明身份，此过程用helo命令完成，helo后连接发送者的域名（可用localhost）。而R的回答是一个表示连接成功的状态码和服务器身份等。例如：<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S: helo 1313s.com<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R: 220 server.com Simple Mail Transfer Service Ready<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在rfc821定义的状态码中，通常以2或3开头的表示成功，以4或5开头的表示传输过程出现了问题。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果是需要服务器身份验证的话，还用发送AUTH LOGIN。<br/>&nbsp;&nbsp; 2. 发送头文件。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S: MAIL FROM:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R: 250 OK<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S: RCPT TO:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这里的recipient的地址如果是在SMTP同一服务器上且服务器找不到此地址，就会回答&#34;550 No such user here&#34;。<br/>&nbsp;&nbsp; 3. 发送正文。以DATA开始。以两个换行结束。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S: DATA<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R: 354 Start mail input; end with (两个换行)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S: To: recipient@wh&#101;reau.com<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S: From: someone@somewh&#101;re.com<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S: subject: title<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S: ...<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S: text<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S: etc.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R: 250 OK<br/>&nbsp;&nbsp; 4. 退出连接。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S: QUIT<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R: 221 server.com Service closing transmission channel<br/><br/>以上就是简易的连接过程。当开启Net::SMTP的debug的时候，就会输出类似于此连接过程的东西。 <br/></span>]]></description>
		</item>
		
			<item>
			<link>http://www.cmuch.com/article.asp?id=150</link>
			<title><![CDATA[[Perl]Perl与Mysql]]></title>
			<author>cn_vipus@yahoo.com.cn(cn_vipus)</author>
			<category><![CDATA[Perl资料]]></category>
			<pubDate>Sun,12 Aug 2007 09:35:40 +0800</pubDate>
			<guid>http://www.cmuch.com/default.asp?id=150</guid>
		<description><![CDATA[<span style="font-size:10pt"><br/>一、简介<br/>PERL应用数据库由两种方法，其一是利用本身所配置的DBM包，这个可以建立数据库并对其进行操作，因此可以把DBM包以及其他类似的包看作是一个数据库的扩展。另一个就是利用DBI包或者类似的包建立与其他关系型数据库的连接，显然，我们通常需要利用后者。<br/>数据库接口（DBI）是由TIM BUNCE（Tim.Bunce@ig.co.uk）所书写，DBI是专门为PERL所书写。你可以在<a href="http://www.hermetica.com/technologia/DBI/" target="_blank" rel="external"><a href="http://www.hermetica.com/technologia/DBI/" target="_blank" rel="external">http://www.hermetica.com/technologia/DBI/</a></a> 查找到相应的信息。<br/>最初，DBI只是由Tim Bunce开发的一个接口包，后来，他开发了DBD::Oracle包用于处理与Oracle的接口。然后，就有了一系列的DBD::Modules的包用于处理与其他类型的数据库的接口。同样，你可以在：<br/><a href="http://www.hermetica.com/technologia/DBI/" target="_blank" rel="external">http://www.hermetica.com/technologia/DBI/</a>取得详细的信息。现在可以得到的包有如下：<br/>DBD-Oracle-0.29.tar.gz ： o&#114;acle 数据库<br/>DBD-Informix-0.20pl0.tar.gz ： Informix 数据库<br/>DBD-QBase-0.03.tar.gz ： Quickbase<br/>DBD-mSQL-0.60pl9.tar.gz ： mSQL-based 数据库<br/>DBI-0.67.tar.gz ： DBI 接口<br/>另外还有ODBC的驱动，从而可以载WINDOWS系统下驱动如ACCESS之类的数据库系统。（当然，PERL FOR WIN32中也有WIN32::ODBC的包用于处理ODBC兼容的驱动程序）<br/>当取回DBI的驱动程序包之后，先不急安装，首先，测试PERL5是否安装，这一点很重要，然后：<br/>如果PERL5已经安装： perl Makefile.PL<br/>如果没有安装：perl Makefile.PL PERL_SRC=/path/to/perl/source/dir<br/>然后：<br/>make<br/>make install完成安装<br/>你可以在系统下执行指令$ PERL_DL_DEBUG=255 perl -e &#39;use DBI;&#39;<br/>然后可以得到大致如此的结果：<br/>DynaLoader.pm loaded (/usr/local/lib/perl5/i486-linux/5.003 /usr/local/lib/perl5<br/>/usr/local/lib/perl5/site_perl/i486-linux /usr/local/lib/perl5/site_perl .<br/>/usr/local/lib /usr/local/lib /lib /usr/lib)<br/>DynaLoader::bootstrap for DBI (auto/DBI/DBI.so)<br/>这样说明你的DBI包已经安装成功了。<br/>DBI和DBD包运行的模式如下：<br/>（图：DBI、DBD的工作模式）<br/>让我们看看连接数据发生的典型的过程：<br/>1、载入DBI驱动程序<br/>2、使用DBD连接相应的数据库<br/>3、打开含有SQL指令的游标<br/>4、取回数据集<br/>5、关闭游标<br/>6、关闭数据库连接<br/>7、退出<br/>我们使用DBI之前首先需要声明：<br/>#!/usr/bin/perl -w<br/>use DBI;<br/>我们有两种方法可以建立PERL与数据库之间的连接：<br/>#!/usr/bin/perl -w<br/>use DBI;<br/>#建立与数据库的连接，第4个参数标明数据库类型<br/>$dbh = DBI-&gt;connect( &#39;connection_string&#39;， &#39;username&#39;， &#39;password&#39;， &#39;mSQL&#39; );<br/>if ( !defined $dbh ) {<br/>die &#34;Cannot do \$dbh-&gt;connect: $DBI::errstr\n&#34;;<br/>}<br/>通过这种方法，返回一个数据库句柄。这是一种常用的用法，另外一种方法返回“驱动程序句柄”：<br/>#!/usr/bin/perl -w<br/>use DBI;<br/>$drh = DBI-&gt;install_driver( &#39;mSQL&#39; );<br/>if ( !defined $drh ) {<br/>die &#34;Cannot load driver: $!\n&#34;;<br/>}<br/>这种方法多用来检查是否系统中是否存在某种驱动程序。<br/>在使用中，有三种句柄将要在程序设计中涉及到：驱动程序句柄（Driver Handle）、数据库句柄（DataBase Handle）、语句句柄（Statement Handle），它们之间的关系可以用下图来表示：<br/>以下是一些利用DBI处理数据库的历程：<br/>1、打开连接（数据库）已经关闭<br/>#!/usr/bin/perl -w<br/>#<br/># (c)1996 Alligator Descartes<br/>#<br/># inout.pl: Connects and disconnects from a specified database<br/>use DBI;<br/>if ( $#ARGV &lt; 0 ) {<br/>die &#34;Usage: inout.pl \n&#34;;<br/>}<br/># Cr&#101;ate new database handle. If we can&#39;t connect， die()<br/>$dbh = DBI-&gt;connect( &#39;&#39;， $ARGV[0]， &#39;&#39;， $ARGV[1] );<br/>if ( !defined $dbh ) {<br/>die &#34;Cannot connect to mSQL server: $DBI::errstr\n&#34;;<br/>}<br/># Disconnect from the database<br/>$dbh-&gt;disconnect;<br/>exit;<br/>二、DBI与DBD::mysql<br/>DBI是一个许多数据库通用的接口，这意味着你可以写出一个可以工作于许多不同的数据库的脚本。为此，你需要一个为每中数据库类型定义的DATABASE DRIVER（DBD），对于MySQL来说，这个驱动程序叫DBD::mysql。你可以参考DBIs web page以获得更多的信息。为了获得在Perl5中的关于面向对象编程的概念，请参考the perl OOP page<br/>三、DBI接口<br/>通用DBI方法<br/>connect<br/>建立与一个数据库服务器的连接<br/>prepare<br/>获取准备执行的SQL语句<br/>do<br/>准备并执行一个SQL语句<br/>disconnect<br/>断开与一个数据库服务器的连接<br/>quote<br/>被插入引用字符串（块）<br/>execute<br/>执行存储过程<br/>fetchrow_array<br/>取出下一行到一个数组之中<br/>fetchrow_arrayref<br/>取出下一行到数组中，返回数组的引用<br/>fetchrow_hashref<br/>取出下一行到哈希表，返回其引用<br/>fetchall_arrayref<br/>取出所有的数据到一个数组，返回其引用。<br/>finish<br/>结束语句、释放系统资源<br/>rows<br/>返回作用的行的数目<br/>data_sources<br/>返回本机中可用的数据库的数组。<br/>ChopBlanks<br/>去除空格<br/>NUM_OF_PARAMS<br/>存储过程中占位符的数目<br/>NULLABLE<br/>哪一个行允许Null。<br/>MySQL 的特殊方法<br/>ins&#101;rtid<br/>最后自动递增的值<br/>is_blob<br/>为BLOB的行<br/>is_key<br/>为键的行<br/>is_num<br/>为数字的行<br/>is_pri_key<br/>为主键的行<br/>is_not_null<br/>不能为NULL的行<br/>length<br/>理论上最大的列的数目<br/>max_length<br/>物理上最大的列的数目<br/>NAME<br/>列名<br/>NUM_OF_FIELDS<br/>返回的字段的数目<br/>table<br/>返回的集中的表的名称<br/>type<br/>行的类型<br/>_Cr&#101;ateDB<br/>创建一个数据库<br/>_Dro&#112;DB<br/>删除一个数据库<br/>connect：<br/>使用connect方法建立一个到数据源的连接。$data_source应该以DBI:driver_name:开始，例如：<br/>$dbh = DBI-&gt;connect(&#34;DBI:mysql:$database&#34;, $user, $password); $dbh = DBI-&gt;connect(&#34;DBI:mysql:$database:$hostname&#34;, $user, $password); $dbh = DBI-&gt;connect(&#34;DBI:mysql:$database:$hostname:$port&#34;, $user, $password);<br/>如果用户名或者是口令没有定义的话，那么DBI将使用DBI_USER，DBI_PASS环境变量分别作为其值。如果你没有定义主机的话，那么默认的是“localhost”，如果你没有定义端口号的话，以默认的mysql的端口号（3306）作为端口号。<br/>prepare：<br/>通过数据库引擎预备SQL语句并且返回一个语句句柄($sth)用于参与execute方法，例如：<br/>$sth = $dbh-&gt;prepare($statement) o&#114; die &#34;Can&#39;t prepare $statement: $dbh-&gt;errstr\n&#34;;<br/>do<br/>do方法预备并执行一个SQL语句，返回作用的行的数目，这个方法通常用于非sel&#101;ct的语句，同时一般不需要执行多次（例如：ins&#101;rt，del&#101;te等）。例如：<br/>$rc = $dbh-&gt;do($statement) o&#114; die &#34;Can&#39;t execute $statement: $dbh- &gt;errstr\n&#34;;<br/>disconnect<br/>disconnect将断开与数据库的连接，通常在程序结束的时候使用。例如：<br/>$rc = $dbh-&gt;disconnect;<br/>quote<br/>quote方法用于 &#34;escape&#34;任何在字符串中的特定自负，并且加上引用标记。<br/>$sql = $dbh-&gt;quote($string)<br/>execute<br/>该方法执行一个存储的语句。对于非sel&#101;ct的语句来说，它返回作用的行的数目，对于sel&#101;ct语句来说，该方法仅仅是开始了在数据库中查询，你需要fetch_*方法来取回数据。<br/>$rv = $sth-&gt;execute o&#114; die &#34;can&#39;t execute the query: $sth-&gt;errstr;<br/>fetchrow_array<br/>这个方法取回下一行的数据，并且将其存储在一个数组之中。例如：<br/>while(@row = $sth-&gt;fetchrow_array) { print qw($row[0]\t$row[1]\t$row[2]\n); }<br/>fetchrow_arrayref<br/>这个方法取回下一行的数据，并将其返回在一个对数组的引用之中。例如：<br/>while($row_ref = $sth-&gt;fetchrow_arrayref) { print qw($row_ref-&gt;[0]\t$row_ref-&gt;[1]\t$row_ref-&gt;[2]\n); }<br/>fetchrow_hashref<br/>这个方法取回一行数据，并且返回一个到包含了字段名/值的哈希表的引用。这个方法不如使用一个数组引用的方法有效率。例如：<br/>while($hash_ref = $sth-&gt;fetchrow_hashref) { print qw($hash_ref-&gt;{firstname}\t$hash_ref-&gt;{lastname}\t\ $hash_ref- &gt; title}\n); }<br/>fetchall_arrayref<br/>这个方法被用来从一个SQL语句的执行结果中取回所有的数据（行）。它返回一个数组的引用，你可以通过一个循环来打印/显示这些数据。<br/>my $table = $sth-&gt;fetchall_arrayref o&#114; die &#34;$sth-&gt;errstr\n&#34;; my($i, $j); for $<br/><br/>i ( 0 .. $#{$table} ) { for $j ( 0 .. $#{$table-&gt;[$i]} ) { print &#34;$table-&gt;[$i][$j]\t&#34;; } print &#34;\n&#34;; }<br/>finish<br/>指示没有更多的数据可以被取出，你可以通过这个方法释放语句句柄，并且释放系统资源。例如：<br/>$rc = $sth-&gt;finish;<br/>rows<br/>返回在（up&#100;ated，del&#101;te等）操作中作用的行的数目。这通常被用在do（）或者非sel&#101;ct的execute（）语句之后。例如：<br/>$rv = $sth-&gt;rows;<br/>NULLABLE<br/>返回一个数组的引用，TRUE分别表示这个列可以允许NULL。<br/>$null_possible = $sth-&gt;{NULLABLE};<br/>NUM_OF_FIELDS<br/>通过Sel&#101;ct或者LISTFILEDS语句返回的列的数目。如果数目为0表示一个非Sel&#101;ct语句的执行，例如，Ins&#101;rt，Del&#101;te或者Up&#100;ate等。<br/>$nr_of_fields = $sth-&gt;{NUM_OF_FIELDS};<br/>data_sources<br/>这个方法返回在localhost中的mysql服务中可用的数据库的数组。<br/>@dbs = DBI-&gt;data_sources(&#34;mysql&#34;);<br/>ChopBlanks<br/>这个方法决定了返回的行中是否去除空格。<br/>$sth-&gt;{&#39;ChopBlanks&#39;) =1;<br/>ins&#101;rtid<br/>如果你使用了mysql的自动增值的特性，那么最新的自动增值将被存储。例如：<br/>$new_id = $sth-&gt;{ins&#101;rtid};<br/>is_blob<br/>返回一个数组的引用，TRUE分别表示所指示的列是BLOB。<br/>$keys = $sth-&gt;{is_blob};<br/>is_key<br/>返回一个数组的引用，TRUE分别表示所指示的列是KEY。<br/>$keys = $sth-&gt;{is_key};<br/>is_num<br/>返回一个数组的引用，TRUE分别表示所指示的列包含了数字。<br/>$nums = $sth-&gt;{is_num};<br/>is_pri_key<br/>返回一个数组的引用，TRUE分别表示所指示的列是一个主键。<br/>$pri_keys = $sth-&gt;{is_pri_key};<br/>is_not_null<br/>返回一个数组的引用，FALSE表示这个列可以包含NULL，而你最好使用DBI标准中的NULLABLE属性。<br/>$not_nulls = $sth-&gt;{is_not_null};<br/>max_length、length<br/>返回一个指示最大列的尺寸的数组的引用。最大长度是指在结果的表中的最大数值，LENGTH给出了理论上的最大值。<br/>$max_lengts = $sth-&gt;{max_length}; $lengts = $sth-&gt;{length};<br/>NAME<br/>返回一个列名称的数组的引用。<br/>$names = $sth-&gt;{NAME};<br/>table<br/>返回了表名称的数组的引用。<br/>$tables = $sth-&gt;{table};<br/></span>]]></description>
		</item>
		
			<item>
			<link>http://www.cmuch.com/article.asp?id=149</link>
			<title><![CDATA[[Perl]CPAN FAQ]]></title>
			<author>cn_vipus@yahoo.com.cn(cn_vipus)</author>
			<category><![CDATA[Perl资料]]></category>
			<pubDate>Tue,07 Aug 2007 15:36:17 +0800</pubDate>
			<guid>http://www.cmuch.com/default.asp?id=149</guid>
		<description><![CDATA[<span style="font-size:10pt"><br/>CPAN是什么？在哪里？<br/>&#34;CPAN&#34; = 综合Perl档案网络,它是一个全球范围的匿名ftp站点网络，专门收集与Perl相关的内容（不要与CTAN或CSPAN混淆）。其中对于一个 Perl/Tk的程序员来说可能会感兴趣的文件有（注：以下所提到文件位置均对任何CPAN的ftp站点有效）：<br/>最新版本的Tk都放在modules/by-authors/Nick_Ing-Simmons/目录中。<br/>最新的正式发布的Perl版本都放在src目录中，文件名为latest.tar.gz。<br/>在modules/by-authors/Gurusamy_Sarathy/目录中有较新版本的Perl＋Tk＋很多其它模块的组合发布包。<br/>如果你需要一些比“最新正式版本”旧的或更新的Perl，可以在src/5.0/目录中找找。<br/>另外这里还有很多可以和Tk一起使用的模块，其中包括：<br/>Alan Scheinine的SelFile.pm在modules/by-authors/Alan_Scheinine/目录中。<br/>由Graham Barr最初编写的一些窗口组件可以通过在CPAN上查找“Tk-GBARR”而得到。<br/>Guy Decoux的BLT_Table布局管理器在modules/by-authors/id/GUYDX/目录中。<br/>Ilya Zakharevich的eText插件（用于替代Text组件）在modules/by-authors/id/ILYAZ/etext/目录中。<br/>Brent B. Power的Tk-FileDialog和Tk-WaitBox在modules/by-authors/id/BPOWERS/目录中。<br/>有些爱好者利用其它的Perl模块编写了一些有用的Perl/Tk脚本（如新闻阅读器和网络浏览器等等）。其中你应该考虑安装的包括：<br/><br/>要运行ptknews脚本，你需要Mailtools模块中的Mail/Internet.pm文件，此模块在modules/by-authors/id/GBARR/目录中，这里同时还有最新的libnet-*模块。<br/><br/>编译安装较新版本的Perl/Tk要求你的系统已经安装有URI::URL和HTML::Parse模块。这些模块都是来自modules/by-authors/id/GAAS/目录中的libwww-perl-*.tar.gz包。<br/>CPAN上还有一些文档：<br/><br/>关于Perl的分类的文档都在doc目录中。<br/><br/>在modules/by-authors/id/PVHP/目录中有一些Perl/Tk的“附加”文档（例如常见问题）。（关于Perl/Tk的正式文档，是Tk的安装包里面的Tk/doc/*.htm）<br/>综合信息：<br/>大部分有关Perl/Tk的内容都被同时链接在modules/by-module/Tk/目录中。<br/><br/>Tim Bunce和Andreas Koenig制作的详细的模块列表可以帮助你解决诸如像“HTML::Parse是哪个模块的一部分？”这一类的问题。这个列表在modules/00modlist.long.html目录中，并且会被定期的贴在新闻组里。<br/><br/><br/><br/>下面是52个CPAN的站点和目录（后面是对应的IP）<br/>非洲<br/>南非<br/><a href="ftp://ftp.is.co.za/programming/perl/CPAN/" target="_blank" rel="external">ftp://ftp.is.co.za/programming/perl/CPAN/</a> 196.4.160.12<br/>亚洲<br/>香港<br/><a href="ftp://ftp.hkstar.com/pub/CPAN/" target="_blank" rel="external">ftp://ftp.hkstar.com/pub/CPAN/</a> 202.82.7.4<br/>日本<br/><a href="ftp://ftp.jaist.ac.jp/pub/lang/perl/CPAN/" target="_blank" rel="external">ftp://ftp.jaist.ac.jp/pub/lang/perl/CPAN/</a> 150.65.7.5<br/><a href="ftp://ftp.lab.kdd.co.jp/lang/perl/CPAN/" target="_blank" rel="external">ftp://ftp.lab.kdd.co.jp/lang/perl/CPAN/</a> 192.26.91.6<br/>韩国<br/><a href="ftp://ftp.nuri.net/pub/CPAN/" target="_blank" rel="external">ftp://ftp.nuri.net/pub/CPAN/</a> 203.255.112.6<br/>台湾<br/><a href="ftp://dongpo.math.ncu.edu.tw/perl/CPAN/" target="_blank" rel="external">ftp://dongpo.math.ncu.edu.tw/perl/CPAN/</a> 140.115.25.3<br/>澳洲<br/>澳大利亚<br/><a href="ftp://coombs.anu.edu.au/pub/perl/CPAN/" target="_blank" rel="external">ftp://coombs.anu.edu.au/pub/perl/CPAN/</a> 150.203.76.2<br/><a href="ftp://ftp.mame.mu.oz.au/pub/perl/CPAN/" target="_blank" rel="external">ftp://ftp.mame.mu.oz.au/pub/perl/CPAN/</a> 128.250.209.2<br/>新西兰<br/><a href="ftp://ftp.tekotago.ac.nz/pub/perl/CPAN/" target="_blank" rel="external">ftp://ftp.tekotago.ac.nz/pub/perl/CPAN/</a> 202.49.6.24<br/>欧洲<br/>奥地利<br/><a href="ftp://ftp.tuwien.ac.at/pub/languages/perl/CPAN/" target="_blank" rel="external">ftp://ftp.tuwien.ac.at/pub/languages/perl/CPAN/</a> 128.130.34.160<br/>比利时<br/><a href="ftp://ftp.kulnet.kuleuven.ac.be/pub/mirror/CPAN/" target="_blank" rel="external">ftp://ftp.kulnet.kuleuven.ac.be/pub/mirror/CPAN/</a> 134.58.127.2<br/>捷克<br/><a href="ftp://sunsite.mff.cuni.cz/Languages/Perl/CPAN/" target="_blank" rel="external">ftp://sunsite.mff.cuni.cz/Languages/Perl/CPAN/</a> 194.50.23.220<br/>丹麦<br/><a href="ftp://sunsite.auc.dk/pub/languages/perl/CPAN/" target="_blank" rel="external">ftp://sunsite.auc.dk/pub/languages/perl/CPAN/</a> 130.225.51.30<br/>芬兰<br/><a href="ftp://ftp.funet.fi/pub/languages/perl/CPAN/" target="_blank" rel="external">ftp://ftp.funet.fi/pub/languages/perl/CPAN/</a> 128.214.248.6<br/>法国<br/><a href="ftp://ftp.pasteur.fr/pub/computing/unix/perl/CPAN/" target="_blank" rel="external">ftp://ftp.pasteur.fr/pub/computing/unix/perl/CPAN/</a> 157.99.64.12<br/>德国<br/><a href="ftp://ftp.leo.org/pub/comp/programming/languages/perl/CPAN/" target="_blank" rel="external">ftp://ftp.leo.org/pub/comp/programming/languages/perl/CPAN/</a> 131.159.0.252<br/><a href="ftp://ftp.rz.ruhr-uni-bochum.de/pub/CPAN/" target="_blank" rel="external">ftp://ftp.rz.ruhr-uni-bochum.de/pub/CPAN/</a> 134.147.32.42<br/><a href="ftp://ftp.uni-hamburg.de/pub/soft/lang/perl/CPAN/" target="_blank" rel="external">ftp://ftp.uni-hamburg.de/pub/soft/lang/perl/CPAN/</a> 134.100.32.54<br/>希腊<br/><a href="ftp://ftp.ntua.gr/pub/lang/perl/" target="_blank" rel="external">ftp://ftp.ntua.gr/pub/lang/perl/</a><br/>匈牙利<br/><a href="ftp://ftp.kfki.hu/pub/packages/perl/CPAN/" target="_blank" rel="external">ftp://ftp.kfki.hu/pub/packages/perl/CPAN/</a> 148.6.0.5<br/>意大利<br/><a href="ftp://cis.utovrm.it/CPAN/" target="_blank" rel="external">ftp://cis.utovrm.it/CPAN/</a> 160.80.22.17<br/>荷兰<br/><a href="ftp://ftp.cs.ruu.nl/pub/PERL/CPAN/" target="_blank" rel="external">ftp://ftp.cs.ruu.nl/pub/PERL/CPAN/</a> 131.211.80.17<br/><a href="ftp://ftp.EU.net/packages/cpan/" target="_blank" rel="external">ftp://ftp.EU.net/packages/cpan/</a> 134.222.91.7<br/>挪威<br/><a href="ftp://ftp.uit.no/pub/languages/perl/cpan/" target="_blank" rel="external">ftp://ftp.uit.no/pub/languages/perl/cpan/</a> 129.242.4.34<br/>波兰<br/><a href="ftp://ftp.pk.edu.pl/pub/lang/perl/CPAN/" target="_blank" rel="external">ftp://ftp.pk.edu.pl/pub/lang/perl/CPAN/</a> 149.156.132.152<br/><a href="ftp://sunsite.icm.edu.pl/pub/CPAN/" target="_blank" rel="external">ftp://sunsite.icm.edu.pl/pub/CPAN/</a> 148.81.209.3<br/>葡萄牙<br/><a href="ftp://ftp.ci.uminho.pt/pub/lang/perl/" target="_blank" rel="external">ftp://ftp.ci.uminho.pt/pub/lang/perl/</a> 193.136.16.247<br/><a href="ftp://ftp.telepac.pt/pub/CPAN/" target="_blank" rel="external">ftp://ftp.telepac.pt/pub/CPAN/</a> 194.65.5.98<br/>俄罗斯<br/><a href="ftp://ftp.sai.msu.su/pub/lang/perl/CPAN/" target="_blank" rel="external">ftp://ftp.sai.msu.su/pub/lang/perl/CPAN/</a> 158.250.29.1<br/>斯洛文尼亚<br/><a href="ftp://ftp.arnes.si/software/perl/CPAN/" target="_blank" rel="external">ftp://ftp.arnes.si/software/perl/CPAN/</a> 193.2.1.72<br/>西班牙<br/><a href="ftp://ftp.etse.urv.es/pub/mirror/perl/" target="_blank" rel="external">ftp://ftp.etse.urv.es/pub/mirror/perl/</a> 193.144.20.6<br/><a href="ftp://ftp.rediris.es/mirror/CPAN/" target="_blank" rel="external">ftp://ftp.rediris.es/mirror/CPAN/</a> 130.206.1.2<br/>瑞典<br/><a href="ftp://ftp.sunet.se/pub/lang/perl/CPAN/" target="_blank" rel="external">ftp://ftp.sunet.se/pub/lang/perl/CPAN/</a> 130.238.253.4<br/>瑞士<br/><a href="ftp://sunsite.cnlab-switch.ch/mirror/CPAN/" target="_blank" rel="external">ftp://sunsite.cnlab-switch.ch/mirror/CPAN/</a> 193.5.24.1<br/>英国<br/><a href="ftp://ftp.demon.co.uk/pub/mirrors/perl/CPAN/" target="_blank" rel="external">ftp://ftp.demon.co.uk/pub/mirrors/perl/CPAN/</a> 158.152.1.44<br/><a href="ftp://sunsite.doc.ic.ac.uk/packages/CPAN/" target="_blank" rel="external">ftp://sunsite.doc.ic.ac.uk/packages/CPAN/</a> 193.63.255.1<br/><a href="ftp://unix.hensa.ac.uk/mirrors/perl-CPAN/" target="_blank" rel="external">ftp://unix.hensa.ac.uk/mirrors/perl-CPAN/</a> 129.12.200.129<br/>北美<br/>安大略<br/><a href="ftp://ftp.utilis.com/public/CPAN/" target="_blank" rel="external">ftp://ftp.utilis.com/public/CPAN/</a> 207.34.209.49<br/><a href="ftp://enterprise.ic.gc.ca/pub/perl/CPAN/" target="_blank" rel="external">ftp://enterprise.ic.gc.ca/pub/perl/CPAN/</a> 192.197.182.100<br/>加州<br/><a href="ftp://ftp.digital.com/pub/plan/perl/CPAN/" target="_blank" rel="external">ftp://ftp.digital.com/pub/plan/perl/CPAN/</a> 204.123.2.4<br/><a href="ftp://ftp.cdrom.com/pub/perl/CPAN/" target="_blank" rel="external">ftp://ftp.cdrom.com/pub/perl/CPAN/</a> 165.113.58.253<br/>科罗拉多<br/><a href="ftp://ftp.cs.colorado.edu/pub/perl/CPAN/" target="_blank" rel="external">ftp://ftp.cs.colorado.edu/pub/perl/CPAN/</a> 128.138.243.20<br/>佛罗里达<br/><a href="ftp://ftp.cis.ufl.edu/pub/perl/CPAN/" target="_blank" rel="external">ftp://ftp.cis.ufl.edu/pub/perl/CPAN/</a> 128.227.205.206<br/><br/>伊利诺伊<br/><a href="ftp://uiarchive.cso.uiuc.edu/pub/lang/perl/CPAN/" target="_blank" rel="external">ftp://uiarchive.cso.uiuc.edu/pub/lang/perl/CPAN/</a> 128.174.5.14<br/>麻省<br/><a href="ftp://ftp.iguide.com/pub/mirrors/packages/perl/CPAN/" target="_blank" rel="external">ftp://ftp.iguide.com/pub/mirrors/packages/perl/CPAN/</a> 206.15.105.99<br/>纽约<br/><a href="ftp://ftp.rge.com/pub/languages/perl/" target="_blank" rel="external">ftp://ftp.rge.com/pub/languages/perl/</a> 157.225.178.12<br/>北卡罗来纳<br/><a href="ftp://ftp.duke.edu/pub/perl/" target="_blank" rel="external">ftp://ftp.duke.edu/pub/perl/</a> 152.3.233.7<br/>俄克拉荷马<br/><a href="ftp://ftp.ou.edu/mirrors/CPAN/" target="_blank" rel="external">ftp://ftp.ou.edu/mirrors/CPAN/</a> 129.15.2.40<br/>俄勒冈<br/><a href="ftp://ftp.orst.edu/pub/packages/CPAN/" target="_blank" rel="external">ftp://ftp.orst.edu/pub/packages/CPAN/</a> 128.193.4.12<br/>德克萨斯<br/><a href="ftp://ftp.sedl.org/pub/mirrors/CPAN/" target="_blank" rel="external">ftp://ftp.sedl.org/pub/mirrors/CPAN/</a> 198.213.9.194<br/><a href="ftp://ftp.metronet.com/pub/perl/" target="_blank" rel="external">ftp://ftp.metronet.com/pub/perl/</a> 192.245.137.6<br/>南美<br/><br/>智利<br/><a href="ftp://sunsite.dcc.uchile.cl/pub/Lang/perl/CPAN/" target="_blank" rel="external">ftp://sunsite.dcc.uchile.cl/pub/Lang/perl/CPAN/</a> 146.83.5.204<br/><br/>对于拥有多协议浏览器的人，还可以访问Tom Christiansen的CPANmultiplexer，这里Tk的URL会写成如下的格式：<br/><br/><a href="http://perl.com/cgi-bin/cpan_mod?module=Tk" target="_blank" rel="external"><a href="http://perl.com/cgi-bin/cpan_mod?module=Tk" target="_blank" rel="external">http://perl.com/cgi-bin/cpan_mod?module=Tk</a></a><br/><a href="http://perl.com/cgi-bin/cpan_mod?module=Tk" target="_blank" rel="external"><a href="http://perl.com/cgi-bin/cpan_mod?module=Tk" target="_blank" rel="external">http://perl.com/cgi-bin/cpan_mod?module=Tk</a></a>&amp;readme=1<br/><br/>有些CPAN的站点可以为哪些没有解压缩工具（如gunzip）的用户提供已解压的版本。例如，在ufl的站点，你可以用如下的命令来下载一个解压后的Tk包：<br/><br/>ftp&gt; get Tk400.202.tar<br/><br/>有些CPAN站点是可以用HTTP协议访问的，如：<br/><br/><a href="http://www.cdrom.com/pub/perl/CPAN/" target="_blank" rel="external">http://www.cdrom.com/pub/perl/CPAN/</a><br/><br/><a href="http://www.metronet.com/perlinfo/" target="_blank" rel="external">http://www.metronet.com/perlinfo/</a><br/><br/>如果你已经安装了适当的CPAN和FTP模块（是的，CPAN上有一个用来获取CPAN模块的模块名字就叫CPAN！），你就可以用下面的一行命令来获取并安装一个模块：<br/><br/>perl –MCPAN –e ‘install “Tk”’<br/><br/><br/><br/>想了解CPAN的情况，你可以发e-mail给CPAN的管理员。如果你发现了一些CPAN上没有的Perl资源（请先确认你已经检查了indices目录中的内容！），请告诉CPAN的管理员。如果你有一些自己的模块、脚本或文档想要送到CPAN，请先阅读authors/00upload.howto 的文件然后再与管理员联系。 <br/></span>]]></description>
		</item>
		
</channel>
</rss>
