电信主站 网通分站
购买流程 付款方式 常见问题 在线提问 续租服务 购物车
用户名: 密 码: 忘记密码?
首 页
域名注册
虚拟主机
双线主机
服务器租用
VPS主机
企业邮局
代理专区
客服中心
虚拟主机行业资讯 虚拟主机评测对比 互联网最新动态 技术学院 站长资讯 在线教程 网站运营
搜索优化 服务器 网络编程 图形图象 站长之家 网页制作 操作系统
冲浪宝典 软件教学 视频通信 办公软件 邮件系统 网络安全 认证考试
您当前位置:西部数码->资讯中心-> 网络编程 -> Perl教程
perlcookbook2介绍_perl教程
作者:网友供稿 点击:0
  西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!虚拟主机可在线rar解压,自动数据恢复设置虚拟目录等.虚拟主机免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金!
文章页数:[1] 

摘要:SQL语言在标准数据库以外的应用

问题:你想对一个非关系型数据库结构进行复杂的SQL查询。

解决:使用CPAN上的DBD::SQLite模块

useDBI;$dbh=DBI->connect("dbi:SQLite:dbname=/Users/gnat/salaries.sqlt","","",{RaiseError=>1,AutoCommit=>1});$dbh->do("UPDATEsalariesSETsalary=2*salaryWHEREname=Nat");$sth=$dbh->prepare("SELECTid,deductionsFROMsalariesWHEREname=Nat");#...

讨论:

SQLite模块定义的“数据库”是存在于单个文件中的,把单个文件仿真为一个数据库。在用DBI
连接时,dbname参数指定为该文件名。不像大多数的关系型数据库,在DBD::SQLite定义的数据库不是服务器/客户短架构,没有服务器,它直接与文件交换数据。多个进程可以同时从一个文件中读取数据(此时用SELECTs命令),但是只有一个进程能向文件中写数据(当一个进程写数据的时候其它的进程被挂起)。SQLite支持事务功能,也就是,你可以向多个表做出一系列改动,但是只要你不向SQLite提交这些改动,更新就不会写到文件中。
useDBI;$dbh=DBI->connect("dbi:SQLite:dbname=/Users/gnat/salaries.sqlt","","",{RaiseError=>1,AutoCommit=>0});eval{$dbh->do("INSERTINTOpeopleVALUES(29,Nat,1973)");$dbh->do("INSERTINTOpeopleVALUES(30,William,1999)");$dbh->do("INSERTINTOfather_ofVALUES(29,30)");$dbh->commit();};if($@){eval{$dbh->rollback()};die"Couldntrollbacktransaction"if$@;}
SQLite定义的数据库里面没有数据类型这个概念。不管你在创建一个表的时候指定的是什么数据类型,以后你可以在其中放入任何类型的数值(包括字符型,数字型,日期型,二进制对象/blob)。实际上,创建表的时候你甚至可以不指定数据类型。
CREATETABLEpeople(id,name,birth_year);
SQLite只有在要比较数据的时候,如用WHERE子句或对某些值进行排序,才会考虑数据类型。SQLite在比较数据的时候,只考虑被比较对象的类型,而不管被比较对象所在列的其它数据是什么类型。像Perl一样,SQLite只能识别字符型和数字型。两个数值总是以浮点类型进行比较,两个字符串直接比较。当不同类型的数据比较的时候,数字总是比字符小。只有一种情况SQLite才会关心你为某一列申明的数据类型(需要创建一个值自增加的列的时候)。你可以把这列的类型指定为:“INTEGERPRIMARYKEY”。
CREATETABLEpeople(idINTEGERPRIMARYKEY,name,birth_year);
例子14-6说明这一切是怎么工作的
例14-6整形主键#!/usr/bin/perl-w#ipk-demonstrateintegerprimarykeysuseDBI;usestrict;my$dbh=DBI->connect("dbi:SQLite:ipk.dat","","",{RaiseError=>1,AutoCommit=>1});#quietlydropthetableifitalreadyexistedeval{local$dbh->{PrintError}=0;$dbh->do("DROPTABLEnames");};#(re)createit$dbh->do("CREATETABLEnames(idINTEGERPRIMARYKEY,name)");#insertvaluesforeachmy$person(qw(NatTomGuidoLarryDamianJon)){$dbh->do("INSERTINTOnamesVALUES(NULL,$person)");}#removeamiddlevalue$dbh->do("DELETEFROMnamesWHEREname=Guido");#addanewvalue$dbh->do("INSERTINTOnamesVALUES(NULL,Dan)");#displaycontentsofthetablemy$all=$dbh->selectall_arrayref("SELECTid,nameFROMnames");foreachmy$row(@$all){my($id,$word)=@$row;print"$wordhasid$id\n";}

SQLite支持8位长的字符编码,但是不识别ASCII中的NULL符“\0”。唯一的变通方法就是在你存储数据之前自行编码,然后在取出数据之后再手工解码,就象URL编码或Base64编码方式一样。这甚至可以用在BLOB字段里面。

参照:“ExecutinganSQLCommandUsingDBI”CPAN上DBD::SQLite模块的正式文档。它在SQLite的主页上http://www.hwaci.com/sw/sqlite

 

摘要:发送邮件的时候添加附件

问题:你想要发一封包含附件的邮件,比如包含一份PDF格式的文档

解决:用CPAN上的MIME::Lite模块。

首先,创建包含邮件各种头信息的MIME::Lite对象:
useMIME::Lite;$msg=MIME::Lite->new(From=>sender@example.com,To=>recipient@example.com,Subject=>Myphotoforthebrochure,Type=>multipart/mixed);
然后用attach方法添加附件内容:
$msg->attach(Type=>image/jpeg,Path=>/Users/gnat/Photoshopped/nat.jpg,Filename=>gnat-face.jpg);

$msg->attach(Type=>TEXT,

Data=>Ihopeyoucanusethis!);
 
最后,发送这份邮件,发送它的方法是可选的:
$msg->send();#默认的方法是用sendmail规则发送#指定其它的方法$msg->send(smtp,mailserver.example.com);

 

讨论:

MIME::Lite模块创建并发送带MIME指定类型附件的邮件。MIME是MultimediaInternetMailExtensions的缩写,而且也是在邮件中附带各种文件文档的标准方式。但是,这个规则并不能从邮件信息中把附件提取出来。如果你想从邮件信息中提取MIME指定类型附件,可以参考这篇文章“ExtractingAttachmentsfromMail”

当你创建MIME::Lite对象,以及向创建的对象中添加内容的时候。后面的参数采用“参数名=>值”的有名对形式。有名对的参数名部分应该暗示它代表的邮件头(如,From,To,Subject)以及其它其它MIME::Lite所特有的东西。如果参数名是邮件头,后面应该加上冒号,如:
$msg=MIME::Lite->new(X-Song-Playing:=>NatchezTrace);

然而,当参数名代表的邮件头在表18-2中时,后面可以不加冒号。下表中*代表通配符,例如Content-*可以代表Content-Type和Content-ID但是不代表Dis-Content

表18-2:MIME::Lite头

ApprovedEncryptedReceivedSender
BccFromReferencesSubject
CcKeywordsReply-ToTo
CommentsMessage-IDResent-X-
Content-*MIME-VersionReturn-Path
DateOrganization

MIME::Lite参数类型的完整列表在表18-3中

表18-3:MIME::Lite参数类型

DataFHReadNow
DatestampFilenameTop
DispositionIdType
EncodingLength
FilenamePath

MIME::Lite模块的参数类型决定附件的类型和附件的添加方法:

Path指定作为附件的文件的路径
Filename指定接受方保存附件时,附件的默认文件名。如果指定了Path参数,那么默认的文件名就是路径中的名字
Data指定附件添加的日期
Type指定待添加附件的文件编码类型
Disposition它的值只能是inline和attachment。前者指定接受方打开邮件的时候附件内容会跟在邮件正文后显示,而不单独作为一个附加物。后者指定接受方应该指定一个附件的解码方法,并且保存附件,此时会有提示
FH指定一个读取附件的开放的文件句柄

这儿有几个有用的附件编码类型:TEXT代表text/plain,为Type的默认值;BINARY是application/octet-stream的缩写;multipart/mixed表明邮件有附件;application/msword表明附件为微软的Word文档;application/vnd.ms-excel表明附件为微软的Excel文档;application/pdf表明附件为PDF文档;image/gif,image/jpeg,image/png分别指定GIF,JPEG,PNG文件;audio/mpeg指定MP3格式文件;video/mpeg指定MPEG格式影片;video/quicktime指定Quicktime格式文件。

发送邮件的唯一两种方法是sendmail和Net::SMTP。调用send方法时,若第一个参数为“smtp”,则用Net::SMTP发送邮件。send的其它参数都传给Net::SMTP。
#timeoutof30seconds$msg->send("smtp","mail.example.com",Timeout=>30);
如果你想创建多个MIME::Lite对象,也就是发送多附件,你可以把send作为类方法调用,此时默认发送方法会被替换。
MIME::Lite->send("smtp","mail.example.com");$msg=MIME::Lite->new(opts);#...$msg->send();#sendsusingSMTP

如果你要处理多个消息,用好ReadNow参数。它指定附件应该立即从文件或文件句柄中读取发送,而不是在发送前转化为字符串。

发送邮件不是MIME::Lite能做的唯一事情。你还可以用它把最后的邮件内容变成字符串:

$text=$msg->as_string;
print方法可以把消息的字符串形式写入一个文件句柄自定的文件中:
$msg->print($SOME_FILEHANDLE);
例子18-3是一个发送邮件的程序,它把在命令行输入的文件名作为附件例18-3:发送带附件的邮件
#!/usr/bin/perl-w#mail-attachment-sendfilesasattachmentsuseMIME::Lite;useGetopt::Std;my$SMTP_SERVER=smtp.example.com;#可根据自己情况改变my$DEFAULT_SENDER=sender@example.com;#同上my$DEFAULT_RECIPIENT=recipient@example.com;#同上MIME::Lite->send(smtp,$SMTP_SERVER,Timeout=>60);my(o,$msg);#processoptionsgetopts(hf:t:s:,\o);$o{f}||=$DEFAULT_SENDER;$o{t}||=$DEFAULT_RECIPIENT;$o{s}||=Yourbinaryfile,sir;if($o{h}or!@ARGV){die"usage:\n\t$0[-h][-ffrom][-tto][-ssubject]file...\n";}#constructandsendemail$msg=newMIME::Lite(From=>$o{f},To=>$o{t},Subject=>$o{s},Data=>"Hi",Type=>"multipart/mixed",);while(@ARGV){$msg->attach(Type=>application/octet-stream,Encoding=>base64,Path=>shift@ARGV);}$msg->send();

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
相关主题
文章页数:[1] 
Google
热门文章
·perl常问问题集--第一篇_perl教程
·perl常规表达式(1)_perl教程
·perl语言全面编译(一)_perl教程
·perl语言全面编译(三)_perl教程
·perl语言全面编译(二)_perl教程
·各种平台下perl模块的安装方法_perl教程
·perl语言全面编译(四)_perl教程
·perldbi入门_perl教程
·有线电视宽带数据网络设计管理(上)_视频通信
·perl常问问题集--第一篇_perl教程

最新文章
·php5对mysql5的任意数据库表的管理代码示例(四)_php技巧
·用perl来分析并生成中文excel文件_perl教程
·photoshop基础教程:跟我学调色练习15-室内光效_photoshop教程
·使用perl连接mysql数据库_perl教程
·photoshop把照片打造为漫画艺术风格_photoshop教程
·photoshop绘制印度小美人_photoshop教程
·photoshop快速制作粗糙岩石纹理材质_photoshop教程
·用perl来分析并生成中文excel文件_perl教程
·photoshop特效设计-夜明珠_photoshop教程
·关于xsl中count()的使用_xsl教程


 
 


版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!

特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
  打印  刷新  关闭
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 虚拟主机 | 资讯中心 | 友情链接 | 网站地图

版权所有 西部数码(www.west263.com)
CopyRight (c) 2002~2006 west263.com all right reserved.
公司地址:四川成都市万和路90号天象大厦4楼 邮编:610031
电话总机:028-86262244 86263048 86263408 86263960 86264018 86267838
售前咨询:总机转201 202 203 204 206 208
售后服务:总机转211 212 213 214
财务咨询:总机转224 223 传真:028-86264041 财务QQ:点击发送消息给对方635483282
售前咨询QQ:点击发送消息给对方2182518 点击发送消息给对方241975952 点击发送消息给对方275026793 点击发送消息给对方408235859
售后服务QQ:点击发送消息给对方17708515 点击发送消息给对方307742704 点击发送消息给对方287976517 点击发送消息给对方363783715
《中华人民共和国增值电信业务经营许可证》编号:川B2-20030065号