首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 网络编程-> 移动开发教程
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.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·ems图片格式转换(java)程序
·使用hashtable实现的购物车-ASP教程,ASP应用
·Java中数据库事务处理的实现-JSP教程,Java技巧及代码
·Oracle数据库操作类(c#)-.NET教程,C#语言
·移动短消息技术演进与业务发展浅析
·ASP生成静态网页,学习CASE的用法,以及“权限”的一种控制方法-ASP教程,组件开发
·中国电信发展移动通信的制式与频段选择
·ASP中access数据库的路径问题-ASP教程,数据库相关
·td-scdma系统移动台接入过程浅析
·JAVA与数据库连接方法(三)-JSP教程,数据库相关
最新文章
·fireworks表现vista毛玻璃朦胧效果_fireworks教程
·google adsense哪些情况会被k号_网赚技巧
·减少google adsense展示单元并不能提高收入_网赚技巧
·google adsense“允许域名”新功能很有用_网赚技巧
·于源:办南京人“淘宝”的大三学生_站长访谈
·谈谈网站策划和网站运营方面的点滴经验_站长心得
·美国网站兵败中国的10大思路性执行错误_站长心得
·付款流程中的电话确认_google推广
·google adsense的部分规则的背面_google推广
·googleadsense富翁排行榜最猛每月赚30万美元_google推广
相关主题
  • perlcgi程式写作常问问题集(4)安全_perl教程
  • perlcgi程式写作常问问题集(3)cgi与wwwserver_perl教程
  • perlcgi程式写作常问问题集(2)modules(模组)_perl教程
  • perlcgi程式写作常问问题集(1)入门简介_perl教程
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭