tempad
ReadyGo!技术成就梦想 >>Perl教程 >> PerlCookbook2介绍

PerlCookbook2介绍

ReadyGo!技术成就梦想 网络搜索 efish 2008-2-24 2:49:41

摘要: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"Couldn"trollbacktransaction"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头

ApprovedEncryptedReceivedSenderBccFromReferencesSubjectCcKeywordsReply-ToToCommentsMessage-IDResent-X-Content-*MIME-VersionReturn-PathDateOrganization

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

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

DataFHReadNowDatestampFilenameTopDispositionIdTypeEncodingLengthFilenamePath

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

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

   

[1]  [2]  [3]  上一页  下一页
责任编辑: efish 参与评论 查找更多:
相关文章
用Perl来分析并生成中文Excel文件 用Perl来分析并生成中文Excel文件
使用Perl连接Mysql数据库 使用Perl连接Mysql数据库
Perl变量(1)--纯变量 Perl变量(1)--纯变量
Perl变量(2)--数组 Perl变量(2)--数组
Perl常规表达式(2) Perl常规表达式(2)
Perl变量(3)--关联数组 Perl变量(3)--关联数组
Perl常规表达式(1) Perl常规表达式(1)
Perl语言全面编译(一) Perl语言全面编译(一)
Perl语言全面编译(三) Perl语言全面编译(三)
Perl语言全面编译(二) Perl语言全面编译(二)
2秒记住本站域名

玩过泡泡龙吗?Readygo?Go! 再加上.Com.Cn的后缀,那就是大名小顶的ReadyGo.com.cn

分类导航
ReadyGo!技术成就梦想