Perl DBI培训笔记
- 格式:doc
- 大小:62.00 KB
- 文档页数:10
Perl快速入门1、标量标量是一种变量,只能保存单个值、单个字符串或单个数字。
标量名必须以美元符号“$”开头。
标量上下文则负责表明当前正在使用单个值的情况EXAMPLE$first_name = "Melanie";$last_name = "Quigley";$salary = 125000.00;print $first_name, $last_name, $salary;2、数组数组是一组有序排列的标量,如字符串和/ 或数字。
数组中的各个元素由从0 开始的整数来索引。
数组变量名以“@”符号开头@names = ( "Jessica", "Michelle", "Linda" );print "$names"; #Prints the array with elements separated by a spaceprint "$names[0] and $names[2]"; #Prints "Jessica" and "Linda"print "$names[-1]\n"; # Prints "Linda"$names[3]="Nicole"; # Assign a new value as the 4th element下面是一些常用的内建函数:pop 移除最后一个元素push 把新元素添加到数组末尾shift 移除第一个元素unshift 把新元素添加到数组开头splice 在数组指定位置添加或移除数组元素sort 对数组元素进行排序3、散列关联数组(associative array),又称为散列(hash),是一组未经排序的键/ 值对(key-valuepair),并通过字符串进行索引。
作者:佚名文章来源: 浏览次数:2084 更新时间:2008-5-18 15:58:16本节提供DBI 的背景信息—在编写自己的脚本和支持其他人编写的脚本时,需要这些信息。
如果已经熟悉DBI,则可以略过这节,直接跳到7 . 3节“运行DBI”。
DBI 数据类型从某些方面来说,使用Perl DBI API 类似于使用第6章介绍的C 客户机库。
在使用C 客户机库时,主要依靠指向结构或数组的指针来调用函数和访问与MySQL相关的数据。
在使用DBI API 时,除了函数称为方法,指针称为引用外,也调用函数和使用指向结构的指针。
指针变量称为句柄,句柄指向的结构称为对象。
DBI 使用若干种句柄。
它们往往通过表7-1所示的惯用名称在DBI 文件中引用。
而惯用的非句柄变量的名称如表7 - 2所示。
实际上,在本章中,我们并不使用每个变量名,但是,在阅读其他人编写的DBI 脚本时,了解它们是有用的。
表7-1惯用的Perl DBI 句柄变量名名称说明$dbh数据库对象的句柄$sth语句(查询)对象的句柄$fh打开文件的句柄$h“通用”句柄;其意义取决于上下文表7-2 惯用的Perl DBI 非句柄变量的名称名称说明$rc从返回真或假的操作中返回的代码$rv从返回整数的操作中返回的值$rows从返回行数的操作中返回的值@ary查询返回的表示一行值的数组(列表)一个简单的DBI 脚本让我们从一个简单脚本d um p _ member s开始,它举例说明了DBI 程序设计中若干标准概念,如与MySQL服务器的连接和断开、检索数据等。
此脚本产生的结果为以制表符分隔形式列出的历史同盟成员。
这个格式本身并不让人感兴趣:在这里,了解如何使用DBI 比产生漂亮的输出更为重要。
dump_members 如下:要想自己试验这个脚本,可以下载它(请参阅符录A),或使用文本编辑器创建它,然后使之可执行,以便能运行。
当然,可能至少需要更改一些连接参数(主机名、数据库名、用户名和口令)。
Perl中的⽂件读写学习笔记⼀、打开、关闭⽂件语法为open (filevar, filename),其中filevar为⽂件句柄,或者说是程序中⽤来代表某⽂件的代号,filename为⽂件名,其路径可为相对路径,亦可为绝对路径。
复制代码代码如下:open(FILE1,"file1");open(FILE1, "/u/jqpublic/file1");打开⽂件时必须决定访问模式,在PERL中有三种访问模式:读、写和添加。
后两种模式的区别在于写模式将原⽂件覆盖,原有内容丢失,形式为:open (outfile,">outfile");⽽添加模式则在原⽂件的末尾处继续添加内容,形式为:open(appendfile, ">>appendfile")。
要注意的是:不能对⽂件同时进⾏读和写/添加操作。
open的返回值⽤来确定打开⽂件的操作是否成功,当其成功时返回⾮零值,失败时返回零,因此可以如下判断:复制代码代码如下:if (open(MYFILE, "myfile")) {# here's what to do if the file opened successfully}当⽂件打开失败时结束程序:复制代码代码如下:unless (open (MYFILE, "file1")) {die ("cannot open input file file1\n");}亦可⽤逻辑或操作符表⽰如下:复制代码代码如下:open (MYFILE, "file1") || die ("Could not open file");当⽂件操作完毕后,⽤close(MYFILE); 关闭⽂件。
⼆、读⽂件语句$line =<> ;从⽂件中读取⼀⾏数据存储到简单变量$line中并把⽂件指针向后移动⼀⾏。
第一章概述Perl: Practical Extraction and Report Language.注释的方法为在语句的开头用字符#,如:# this line is a comment第二章简单变量一、整型1、整型:$x = 12345;PERL实际上把整数存在你的计算机中的浮点寄存器中,所以实际上被当作浮点数看待。
2、8进制和16进制数8进制以0打头,16进制以0x打头。
例:$var1 = 047; (等于十进制的39)$var2 = 0x1f; (等于十进制的31)二、浮点数如11.4 、-0.3 、.3 、3. 、54.1e+02 、5.41e03浮点寄存器通常不能精确地存贮浮点数,从而产生误差,在运算和比较中要特别注意。
指数的范围通常为-309到+308。
三、字符串惯用C的程序员要注意,在PERL中,字符串的末尾并不含有隐含的NULL字符,NULL 字符可以出现在串的任何位置。
双引号内的字符串中支持简单变量替换,例如:$number = 11;$text = "This text contains the number $number.";则$text的内容为:"This text contains the number 11."双引号内的字符串中支持转义字符:Table 3.1. Escape sequences in strings.\L、\U、\Q功能可以由\E关闭掉要在字符串中包含双引号或反斜线,则在其前加一个反斜线,反斜线还可以取消变量替换,如:$res = "A quote \" and A backslash \\";$result = 14;print ("The value of \$result is $result.\n")的结果为:The value of $result is 14.可用\nnn(8进制)或\xnn(16进制)来表示ASCII字符,如:$result = "\377"; # this is the character 255,or EOF$result = "\xff"; # this is also 255单引号字符串单引号字符串与双引号字符串有两个区别,一是没有变量替换功能,二是反斜线不支持转义字符,而只在包含单引号和反斜线时起作用。
可移植的DBI方法:connect 建立到一个数据库服务器的连接disconnect 断开数据库服务器的连接prepare 准备执行一个SQL语句execute 执行准备好的语句do 准备并执行一个SQL语句quote 加引号于要插入的字符串或BLOB值fetchrow_array 作为一个字段数组取出下一行fetchrow_arrayref 作为一个字段的引用数组取出下一行fetchrow_hashref 作为一个哈希表的引用取出下一行fetchall_arrayref 作为一个字段数组取出所有数据finish 完成一条语句并且让系统释放资源rows 返回受影响的行数data_sources 返回可在localhost上得到的数据库的数组ChopBlanks 控制fetchrow_*方法是否剥去空格NUM_OF_PARAMS 在准备的语句中的占位(placeholder-参数)的数目NULLA BLE 其列可以是NULLtrace 执行调试跟踪##########################################################################$dbh 数据库句柄$sth 语句句柄$rc 返回代码(经常是一个状态)$rv 返回值(经常是一个行数)##########################################################################①connect($data_source, $username, $password)使用connect方法使得一个数据库连接到数据源。
$data_source值应该以DBI:driver_name:开始。
以DBD::mysql驱动程序使用connect的例子:$dbh = DBI->connect("DBI:mysql:$database", $user, $password);$dbh = DBI->connect("DBI:mysql:$database:$hostname",$user, $password);$dbh = DBI->connect("DBI:mysql:$database:$hostname:$port",$user, $password);②disconnectdisconnect方法从数据库断开数据库句柄。
perl内部并不存在整数,在perl内部总是按照双精度浮点数的要求来保存数字并进行运算的。
如果要使perl支持unicode字符,需要添加 use utf8;\l 将下一个字母转换为小写\L 将它后面的所有字母都换为小写,直到\E为止\u 将下一个字母转换为大写\U 将它后面的所有字母都换为大写,直到\E为止\Q 相当于把它到\E之间的非单词字符加上反斜杠\E 结束\L、\U、\Q开始的作用范围per的告警信息:use warnings;或者使用 perl -w运行脚本或者加上 #!/usr/bin/perl -w如果看不懂告警,就是用use diagnostics;打印更详细的信息$#aaa表示aaa数组的最后一个元素的索引值关于perl中布尔值的判断1、如果是数字,0为假;所有其他的为真2、如果是字符串,空字符串为假,所有其他的字符串为真3、如果既不是数字也不是字符串,那就先换成数字或者字符串再进行判断。
使用defined函数来判断变量是否定义数组定义:my @p1=('aaa','bbb','ccc');my @p2=(1..100);my @p3=qw(aaa bbb ccc);my @p4=qw! aaa bbb ccc !;$end=$#p1;$number=$#p1+1;$last=$p1[$#p1];$last=$p1[-1];pop取出数组中的最后的一个元素并将其作为返回值返回。
$last=pop(@p1);push添加元素到数组的最后push(@p1,'jaj');push @p1,'aaaa';push @p1,@p2;shift取出数字第一个元素并将其作为返回值返回$first=shift(@p1);unshift添加元素到数组的最左边unshift(@p1,'jaj');unshift @p1,@p2;splice可以实现从中间操作数组;foreach 来循环遍历数组中的值reverse反转数组sort 对数组进行排序sort(@p1) 正向排序reverse sort(@p1) 逆向排序chomp(@p1);chomp(@line =<STDIN>);可以使用state操作符来声明持久性私有变量state $sum=0;state @numbers;打印数组:print @arrayprint "@array"@ARGV是存放所有参数的数组<>砖石操作符,把输入参数当作文件处理文件操作符(文件句柄)open CONFIG, 'test';open CONFIG, '<test';open CONFIG, '>test';open CONFIG, '>>test';关闭文件句柄:close CONFIG;读取或者写入的时候指定文件的字符编码open CONFIG, '<:encoding(UTF-8)', 'test';open CONFIG, '>>:encoding(UTF-8)', 'test';打印perl能处理的字符编码清单perl -MEncode -le "print for Encode->encodings(':all')"判断文件句柄是否成功的代码:my $success=open CONFIG, '>>', test';if( !$success ){print "create file faild";}if( ! open CONFIG, '>>', 'test' ){die "Can't create config file: $!";}if( @ARGV<2 ){die "Not enough arguments\n";}自动检查致命错误use autodie;可以将文件句柄设置成变量,这样文件句柄可以作为子程序的参数传递,或者放在数组和hash中排序,或者严格控制其作用域。
书籍: Perl语言入门Chapter 1: Perl的数据类型1 数据类型在Perl中一律使用双精度浮点数进行计算,也就是说,在Perl内部并不存在整数值,程序中所用到的整形常量会被转换成等效的浮点数值.例如:3.07.25e45 #7.25乘以10的45次方,其中#后面的都是注释0377 #八进制,相当于十进制的2550xFF #十六进制的FF,相当于十进制的2550b11111111 #二进制,相当于十进制的2552 操作符Perl提供'+','-','*','/','%'等操作符,含义于C一样,其中%操作符只对两边的整数部分进行运算,如10.5%3.2和10%3的结果相同,乘幂操作符(**),2**3代表2的三次方也就是8。
Perl也提供类似C的双目操作符,如$fred+=5,$str.=" ";3 字符串Perl字符串分为单引号字符串和双引号字符串。
在单引号字符串中,除了单引号和反斜线之外,单引号内的所有字符都代表他们本身(在字符串换行时也包括换行字符),单引号内的\n并不代表换行符,而是代表反斜线和n这两个字符,只有后面是另一个反斜线或单引号时,前面的反斜线才有特殊意义。
例如:'hello\n' #hello后面跟着反斜线和n'\'\\' #单引号后面跟着反斜线双引号字符串和其他语言差不多,反斜线拥有完整的控制力.例如:"barney" #和'barney‘一样"hello world\n" #hello world 后面跟着换行符字符串可以用点号(.)来彼此连接,如"hello"."world"于"helloworld"相同.字符串复制操作符,是一个小写字母x,此操作符会将左边字符与它本身连接,次数由右边操作符指定,如"fred"x 3 与"fredfredfred“相同.Perl会视需要在字符串和数字之间相互转换,在需要数字时,如(+)时,Perl会自动将字符串转换为等效的十进制浮点数,因此"12"*"3"的结果是36,字符串中非数字的部分会被略过,所以"12fred34"*"3"的结果也是36。
Perl DBI培训笔记(2008-04-15 16:46:39)转载分类:工作笔记标签:perldbiNCR的ETL专用语言采用了Perl,Perl的数据库编程是基于它的DBI函数库展开的,有点类似于ADO。
在用Perl做ETL时,更多的只是采用它的DBI来嵌sql或存储过程,而将数据清洗、转换的工作交给数据库去完成。
以下是我做的Perl培训笔记。
字符串的连接$line = "123";$line .= "456" ;当在大循环中,这种连接方式比$line=$line."456" 要高效;格式化打印$a = 0266;$b = 0xFF;print "$a, $b\n"; #输出182 255printf "%lo, %lX\n", $a, $b; #输出266 FF系统命令$file="line.pl";system("notepad $file");控制程序流的结构if() {} elsif() {} else {}while($i<15){last if ($i==5); 使当前正在运行的最里面的循环退出;$i++;}for($i=0; $i<100; $i++){next if (not $i%5); next返回下一个循环,print语句被跳过了;print " $i "}可以对while与for循环块设置标号,然后对last与next指定标号,如XXX:for() last:XXX;数组赋值@boy=qw(chenld lilac ldchen chenlianding linhw ruanjj gaosy chencj huangyk);数组打印print "@boy ";print $boy[0];print $boy[-1]; #是指打印倒数第1个元素;print scalar(@boy); #=9print $#boy; #=8 #数组中最后一个元素的下标$size=@boy; #=9 #数组的大小赋值运算符左边的表达式类型(列表或标量) 用于决定右边的表达式计算时所在的上下文;可以用一个称为scalar的特殊伪函数来强制将某个东西放入标题上下文;($b)=@boy; 左边为列表;$a =@boy; 左边为标量;当地时间print scalar(localtime);($sec,$min,$hour,$mday,$mon,$year_off,$wday,$yday,$isdst)=localtime;数组的遍历for($idx=0; $idx<@boy; $idx++) {}foreach $person (@boy) { }@long=grep length($_)>5, @boy; 搜索数组@boy=split(/ /, "chenld lilac ldchen linhw"); 用空格进行分割;$numbers=join(',', (1..10)); 用逗号进行数字的组合;join(' ', sort @boy); 对数组进行重新排序;join(' ', reverse sort@boy); 对数组进行倒序操作;对数组最后一个元素的操作my @array = qw{11 22 33};push @array, '00'; #把00添加在数组最后面;pop @array; #把最后面一个元素00给丢弃掉;对数组第一个元素的操作my @array = (1...3); #1 2 3shift @array; #2 3unshift @array, '-1'; #-1 2 3unshift @array, '-2'; #-2 -1 2 3哈希结构的赋值$food{'apple'}='水果'; $food{'pear'}='水果'; $food{'carrot'}='蔬菜'; %food=('apple', '水果', 'pear', '水果', 'carrot', '蔬菜');%food=('apple'=>'水果', 'pear'=>'水果', 'carrot'=>'蔬菜');哈希的引用print $food{'apple'};foreach $one (keys %food) {print "$one\n"; print "$food{$one}\n"} @one=values %food;@two=keys %food;@three=%food;if (exits $Hash{keyval}) {判断是否存在哈希关键字;}delete $Hash{keyval}; 删除哈希关键字;对每一行文本分割成单词,然后进行统计while {<>}{while(/(\w[\w-]*)/g){$words{$_}++;}}foreach(keys %words){print "$_ $words{$_}\n";}在数组中寻找唯一的元素%seen=(); 对哈希结构初始化;foreach (@boy){$seen($_)=1; 对单词列表进行初始化,依次将$_设置为每个单词}@uniqueWord=keys %seen;数组之间的交汇部份,两个数组是@ones与@twos$seen=();foreach(@ones){$seen($_)=1; 把数组starts中的元素放入哈希结构,并设置值为1;}@interSection=grep( $seen($_), @twos); 数据交汇部份@interSection=grep(!$seen($_), @twos); 数据不同部份对哈希结构进行排序foreach(sort keys %words){print"$_ $words($_) \n";}foreach(sort {$words{$a} <==> $words{$b} } keys %words){print"$_ $words($_) \n";}文件的相关操作open (MYFIEL,"D:\\xx\\xx.txt") || die "不能打开文件:$i\n"; open (MYFIEL,"D:/xx/xx.txt") || die "不能打开文件:$i\n";while(defined($a=)) {print $a;}while() {print $_;}@contents=; 第i个元素对应文件的第i行;写文件通过文件名前的>与>>来告诉perl要对打开的文件进行写入;>是替换原来的旧文件,而>>是将数据插入到原文件的末尾;open(LOGF, ">>logfile"} || die;if (! print LOGF "这个文件的最后修改时间:", scalar(localtime), "\n"){ warn "不能修改这个文档:$i\n";}close(LOGF);print LOGF ; 用于文件的拷贝;open(PH,"xx.gif") || die;binmode(PH); //通知二进制文档;print PH "GIF87a\056\001\045\015\000";if (-s $filename) { 文档是否存在,如果存在返回字节量;warn "文档$filename将被覆写。
\n";-M $filename, "天之前。
\n"; 返回最后修改以后的天数;}模式匹配/x{5,7}/ x最少出现5次,最多7次,/x{0,3}/ 可以不出现,最多3次;/x{4, }/ 最少出现4次,最多不限;/x{2}/ 只能出现2次/aa.*bb/匹配aa开头,bb结尾的任何东西,符号是.*;[abcde]等同于[a..e],用于匹配a b c d e上的任何一个字符;G 用于匹配大写G或小写g[0-9] 只能匹配一个数字;[0-9]+用于匹配一个或多个数字;[A-Za-z]{5} 用于匹配一级5个字母的字符;/[^A-Z]/ 匹配非大写字母\w等同于[a-zA-Z0-9_],匹配单词字符;\W刚好相反,匹配非单词字符\d赞同于[0-9], 匹配一个数字;而\D匹配非数字\s赞同于[\t\f\r\n],用于匹配制表换页回车换行这个白空间;而\S匹配非白空间;/aa|bb/ 用于匹配aa与bb中的一个,或以通过()使用多个|选择/^AA/只匹配以AA开头的行/^An.*gg$/ 匹配An开头gg结尾的所有行;/^$/匹配所有的空行;此外还有/^/、/$/;s/is/was/ 是把is替换成was;s/^\s+// 删除行开头处的所有白空间;$ww="185 lbs";$ww=~s/ lbs//;=~并没有进行赋值,它只是取出右边的运算符,并使它对左边的变量进行操作;/abc/i 是对abc进行匹配,可是大小写的abc以及混合大小写的abc$_="one faaa, two fbbb, three fccc, four fddd";@fxxx=m/\W(f\w\w\w)/g; 首先匹配非单词字符,并找出f开关的4个字符,最后进行合局匹配;$_="800-555-1212";if (/(\d{3})-(\d{3})-(\d{4})/){s/(\d{3})-(\d{3})-(\d{4})/$1->$2->$3/;}对数据中的元素进行模式匹配并修改@newArray=grep s/aaa/aabbcc/, @oldArray;函数调用与参数传递sub displayArray{@a=@_;print "传入的数组参数为: @a \n";}@arr=qw(AAA BBB CCC DDD EEE FFF GGG);displayArray(@arr);类似于指针的概念,在perl中称为引用。