Chinaunix首页 | 论坛 | 博客
  • 博客访问: 31322
  • 博文数量: 10
  • 博客积分: 580
  • 博客等级: 中士
  • 技术积分: 95
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-27 16:11
文章分类

全部博文(10)

文章存档

2008年(4)

2007年(5)

2006年(1)

我的朋友

分类:

2008-11-16 14:03:43

刚到公司第一个项目居然是做CGI 的开发,从来没有接触过,于是开始学习perl语言,网上搜了一个遍,文档不是很多,大部分都是一篇文章反复转载的,文章开头大部分都是说perl语言怎么简单,怎么灵活,稍微整理了一下开始看,按照经验,从-变量类型-数组-控制-循环-函数调用-内置函数。。一路开下来,两天下来觉得自己已经入门了,于是开始看原项目代码,结果90%的代码都看不懂,感觉很失败,perl语言真的太灵活了,在加上他们用了很多开发技巧,要掌握需要一定时间,幸好项目大部分都是对原系统的改造,希望能应付过关,下边是perl最基础部分的一些整理资料:

      首先要知道,Perl是一脚本言。所的脚本,就是没有主函数,从最始一行一行的按照序解释执行(老版Basic不也是如此)。因此,尽管把你的思路流程用Perl表达出来吧。
  其次,Perl设计中参考了很多言的长处,并避免了设计上的缺陷。因此Perl的很多法你可能都会得似曾相。我把Perl总结了一下,和C言做了一个简单比表格。表格左右两句是CPerl对应表达同一个功能各自的不同方式。如果者有C言的经验,相信看到比可以很快的上手吧?

法元素
C
Perl
Perl
/* … */
# …
只支持行注
int a, b, c;
char c=’A’;
int x[10];
my ($a, $b, $c);
my $c='A';
my @x;
my %h;
声明使用my
表示量以$开头,表示数量以@开头,表示哈希表的量以%开头
声明可以省略(不建)
字符串
char* h1=”hello\n”;
char* h2=”hello\\n”;
$h1=”hello\n”;
$h2=’hello\n’;
双引号解内部的\n,而引号不解
int arr[10];
arr[0]=0;
for(i=0;i<10;i++)
arr[i]=i;
my @arr;
$arr[0]=0;
@arr[3..5]=(3..5);
声明以@
动态,不需要指定大小
从0
访问元素候,要以$开头表示访问的是数
[3..5]表示数中下标为35的元素成的数
可以直接赋值
int arr[10][10];
arr[0][1]=9;
my @arr;
$arr[0][1]=9;
Perl并不直接支持多,而是以数引用的方式接支持。例如arr[0]的内容就是一个数的引用地址。
char c;
int* x=&c;
c='a';
printf(*x);
my $c;
my $x=\$c;
$c='a';
print $x;
\C中的&似,意思是取引用
 
void hello() {
  printf(“Hello\n”);
}
void (*hi)()=hello;
(*p)();
sub hello{
       print "Hello\n";
}
my $hi = *hello;
&$hi;
&表示用函数
*取函数的代地址
不必用括号把参数括起来
的括号也是可
条件
if (x>0) x=0;
x>0 ? x=0 : ;
if ($x>0) { $x=0; }
$x=0 if $x>0;
$x=0 unless $x<=0;
$x>0 ? $x=0 : ;
if 构可以反,意,注意前句没有分号。
名思, unless除非的意思。里的四个表达方式是等价的。注意第一方式中,条件部分的括号和句部分的花括号是不可省略的。
环语
foreach (@arry)
foreach my $key(@ary)
foreach $count (1..10)
for/while法都和C似。
foreach关键字也可以用for,意
函数
int max(int x, int y)
{
  return x>y?x:y;
}
 
int n=max(1,2);
sub max
{
       my ($x, $y)=@_;
       return $x>$y?$x:$y;
}
my $n=max(1,2)
注意下划线”_”也是一个合法的量名。而@_Perl内置的一个数,内容函数的参数。
my ($x, $y) 表示声明了一个有两个元素的数,并将两个元素映射到$x$y上。
($x,$y)=@_;表示两个数制,@_对应的元素的赋值给$x$y.是一个便的写法,也可以这样
my $x=$_[0]; my $y=$_[1];
return是可的,默返回最后一个表达式的
1.       编译时开编译器所有的警告选项
2.       使用lint工具
 
3.       perl –w myprogram.pl 运行警告开关,如果运行Perl检查到了可能的错误,会示警告信息,否它默是什也不提示继续执行。
4.       #!/usr/bin/perl –w 在代文件第一行中加入-w选项开关
5.       use strict; 使用
运行
编译后直接
 
1.       perl myprogram.pl 手工
2.       #!/usr/bin/perl
Unix下在代第一行加入,然后文件加上可行的属性 chmod +x myprogram.pl,之后就可以用./myprogram.pl命令来运行。
3.       Windows下,安装ActivePerl候,已.pl的文件和perl的解程序关联起来了,因此直接双文件图标就可以运行。


  
见问题
   1程序的入口参数怎取?
  内置数@ARGV包含了所有的运行参数。可以打印出来看看print @ARGV;
  2函数如何参数、取参数?
  个函数内部都有一个内置的数 @_ 个数的元素就是函数的参数。例如入的第一个参数就是$_[0],第二个是$_[1]。唔,如你所Perl的函数参数就是C中的动态参数。
  3认变量是什
  个可能会把你的。有一个内置 $_
  4示消息、退出常简单写法
  die ‘Error on program’;
  也可以在条件不足的情况下使用
  die ‘Configuration error’ unless($doc->getDocumentElement);
  5格式化
  可以用简单print行一般的出操作,如果需要复杂的格式化出,可以使用printf……C的用法几乎是一的。
  printf("pi=%.6f", 355/113);
  6 =>是什么东西?
  在使用Hash表的候,可以常看到=>个符号。例如这样的一个定:
  my $account={

  'Simon'=> 'simon@email.com',

  'Jesse'=> 'jesse@email.com'

  };

  其=>符号跟逗号”,”是等价的。Perl里面的Hash表事上是一个数,只是把奇数位元素看做是Key),而把偶数位的元素看做是Value)。

  7于引用的一点

  Perl的引用C的指,所的引用事上就是地址。取一个量的地址用反斜杠”\”操作符,例如 $p=\$x; $p就是一个指向$x量的指。要引用指,使用”$”操作符,例如 print $$p; 就是打印$x

  引用不单单可以引用量,也可以引用数HASH表、函数,取函数的地址可以使用*操作符。
 
 
########################################
(1)--纯变

Perl
有三种变量:

  一、纯变

  又称量,是Perl理的最简单的数据型。量可以是数字(2,32.5e6)
也可以是字符串(“hello”教室”)

  Perl中的量以美元符号$和一个字母始,以后可以是字母、数字和下划线
大小写有区,而且所有字母、数字和下划线都有效。如:

  $a$A是不同的量;
  $this_is_a_long_variable_1
  $this_is_a_long_variable_2是不同的量;

  Perl中的量可以通操作符(+.)生新的量。你可以从文件和设备
量,也可以将其出。

  使用要在前面加上$符号, 注意:指定的纯变量是一个字符的,就要加
""双引号或引号;如果是数,就不用加上""个符号。

  量数据又可以分数字和字符串两

  数字

  可分整型量和浮点量。
  整型:(2,-200,3568)Perl支持8制和16量,8制以0开头(025
5
,表示8制的255)16制以0x0X开头 (-0x1a,代表1A)
  :(2.5,-6.3e5,-2.3-e6)

  字符串

  最短的字符串可以没字符,最可以把你的内存填Perl无内置限制
的原一致。
字符串有两格式:引字符串和双引字符串。
  引字符串(single-quoted string): 就是用引号括起来的一串字符。该单
符串不是字符串的一部分。引号中可以插入任何字符。只有两情况例外,一是中
插入引号,并在前面有一反斜杠;一是字符串有两个着的反斜杠。
  双引字符串(double-quoted string): 就是用双引号括起来的一串字符,其作用
似于C言。

  双引字符串中反斜杠转义

  

\n

\r

\t
水平置表符
\f
换页
\b
退格
\v
垂直置表符
\a

\e Esc
\007
任一八ASCII(007表示bell)
\x7f
任一十六ASCII
\cC
任一控制字符
\\
反斜杠
\"
双引号
\l
下一字母小写
\L
以后所有字母小写直到\E
\u
下一字母大写
\U
以后所有字母大写直到\E
\E
\L\U

  量的运算符

1
赋值运算符
如:$a=23; #23赋值给$a
$b=$a=23; #
23赋值给$a$b
$b=3+($a=2); #
2赋值给$a,再加3值赋给$b,即$b5

2
、二元赋值运算符
如:$a=+3; #等同于$a=$a+3
C言中基本相同。

3
、自增自减运算符
如:$a++; #等同于$a=$a+1
与C言中基本相同。

4
、chop()运算符
如:$a="hello";
chop($a); #
时$a值为"hell"
这对于从屏幕取文本后去除行符很有用。
如:$a=; #取文本
chop($a); #
去除最后的行符。
两行可合并
chop($a=);

5
、字符串的量插入
如:$a="zmd";
$b="hello! $a";
$b
值为"hello! zmd"

合示例

$url1='hello'; #
将hello串字符赋给$url1量;
$url2='don\'t'; #
将don't串字符赋给$url2量;
$url3='hello\n'; #
将hello\n串字符赋给$url3量;注意\n不被当作行符而是\和n
两个字符;
$url1="
#串字符赋给$url1
$url2="/cgi-bin/"; #将/cgi-bin/个字符赋给$url2量;
$url3=$url1.$url2; #将两个量的字符串起,
$url3="
$int=5; #
将10赋给$int量;
$int=5+6; #$int=11;
$int=5*6; #$int=30;
$int=5;$int++; #$int=6;
$int=5;$int+=8; #$int=13;
$a="\Uzmd";$b="\u\LZHENG";$c="$a $b" #$a="ZMD"; $b="Zheng";
$c="ZMD Zheng"
 
Perl(2)--

<../../../../images/line1.gif>
二、数

  数量数据的有序列表。

  数可以含任意多个元素。最小的数可以不含元素,而最大的数可以占全部
可用内存。

  数组实(array literal)是位于括号内用逗号分的一系列。如:

1,2,3,4,5#具有1,2,3,4,5五个数的数
"zmd",1974,173.5#具有"zmd",1974,173.5三个数的数
()#空数
$a,5#两个数$a5
$a+$b,6#两个数


组变量具有独的数组值,要以@而不是$。如:

@zmd

注意@zmd$zmd没任何系。Perl为对象的不同型保留独立的命名空


赋值赋值,也用等号表示。Perl根据赋值对象是是数组变量来
确定赋值操作是赋值还是数组赋值

若数组实量中只含有量引用(不是表达式)此数组实量也可作为变量使用。它可以
用在赋值运算符的左。例如:

($a,$b,$c)=(1,2,3) #1赋给$a2赋给$23赋给$3

如果把数值变赋给标量,则赋给标量的就是数组长度,如:

@zmd=(1,2,3) # (1,2,3)赋给@zmd
$a=@zmd # $a3,即@zmd的数个数


元素的访问C言中似,下是按序整数排列的,号从0始。

($a,$b,$c)=(1,2,3) #将1赋给$a,2赋给$2,3赋给$3

如果把数值变赋给标量,则赋给标量的就是数组长度,如:

@zmd=(1,2,3) # 将(1,2,3)赋给@zmd
$a=@zmd # $a为3,即@zmd的数个数




@user1=("zmd","cxm"); #将zmd和cxm两个字符串赋给@user1
@user2=@user1; #这时@user2=@user1=("zmd","cxm")
@user3=("zk",@user1); #这时@user3=("zk","zmd","cxm")
($one,@user4)=@user3; #这时$one="zk"
@user1=(); #把@user1清空
@int1=(1,2,3,4,5); $x=@int1; #将数组@int1的个数赋给$x纯变量,$x=5
$x=$#int1; #$#量返回数最后个数的值(index)$x=4
($x)=@int1; #$x等于数的第一个个数值$x=1
$b=$int1[0]; #$b等于数的第一个元素值$b=1
$c=@int1[0]; #$c同上$c=1,因些呼叫数有两方法
$int1[0]=3; #将3个数值赋给组@int的第一个元素@int1=(3,2,3,4,5)
$int1[0,1]=[7,8]; #将7赋给的第一个元素将8赋给第二个元素@int1=(7,8,3,4 ,5)
@int1[0,1]=@int1[1,0]; #将数前两个元素交换@int1(8,7,3,4,5)
($int1[0],$int1[1])=($int1[1],$int1[0]); #同上@int1=(8,7,3,4,5)
@int2=@int1[0,1]; #int2=(8,7)
$int1[5]=6; #
将6赋给中第六个元素@int1=(1,2,3,4,5,6)
 
 
Perl(3)--关联


三、关联

  关联和前面的数组类似,它包含量数据,可用索引选择这些数据
,和数不同的是,关联的索引不是非的整数而是任意的量。量称
Keys,可以在以后用于索数中的数

  关联的元素没有特定的序,你可以把它想象卡片。每张卡片上半部
分是索引而下半部分是数

  关联Perl言中特有的,关联是一个功能大的数。使用关联组时
要在前面加上%号,关联的格式如:

%ARRAY=(key1,value1,key2,value2,key3,value3);

一个key都有一个相对应(value)

  和数组类似,$zmd,@zmd,%zmd没有任何系。Perl为对象的不同型保留独立
的命名空

  下面介绍关联的操作:

  在关联中增加、更改一数据:ARRAY={key}=value; 关联ARRAY中加上
key-value,要在关联名称前加上$号,而且key的名称要在{}符号之,最后再
指定key对应value。如果在关联中已key.就会更改key
对应valuekeys(%array)操作符可生成由关联%array中的所有当前关键成的
列表。即返回奇数个元素(1,3,5,7...)的列表。
values(%array)操作符返回由关联%array中所有当前值组成的列表,即返回偶数个
列表。
echo(%array)操作符返回由一个关键字和一个值对构成的两个元素的表。同一数
操作返回下一对值束。若没有更多的对时echo()返回空表。 (在打印全部
列表中很有用)
除一关联中的数据:delete $ARRAY{key};delete Perl 所提供的函数,
作用是关联中的一个key以及个 key 对应的 value。使用方法是
delete 函数之后,指定关联中要除的key名称。

  关联例:

%fred=(one,"zmd",two,"cxm"); $a=$fred{one}; #$a等于"zmd"
$b=$fred{two}; #$b等于"cxm"
$fred{two}="yes"; #%fred=(one,"zmd",two,"yes")
@ list =keys(%fred); #@list=(one,two)
@user=values(%fred); #@user=("zmd","cxm")
($number,$name)=echo(%fred); #
时$number值为one,$name值为"zmd",行一次$number为值为two,$name值为"cxm")
@a=%fred; #关联组fred指定组a,这时@a=(one,"zmd",two,"cxm")
%b=@a; #将数组a指定给关联组b,这时%b=(one,"zmd",two,"cxm")
delete $fred{one}; #关联中key值为one的一对key-value除,这时%fred=(two
,"cxm")
%name=(); #
把%name关联
 
 
Perl的运算符号字符

符号范例
= $x = $y; $x指派$y
+= $x += $y; $x=$x+$y; $x$y之后再指派$x
-= $x -= $y; $x=$x-$y; $x$y之后再指派$x
*= $x *= $y; $x=$x*$y; $x$y之后再指派$x
/= $x /= $y; $x=$x/$y; 求出$x除以$y之后的商数,再指派$x
**= $x **= $y; $x=$x**$y; $x乘上$y次方之后再指派$x
%= $x %= $y; $x=$x%$y; 求出$x除以$y的余数以后,再指派$x
.= $str1 .= $str2; $str1=$str1.$str2; $str1个字符串再加上$str2个字符串
之后,再指派$str1个字符串
x= $str x= $y; $str=$strx$y; $str字符串$y,并反果指派str个字符串

  算(Arithmetic)运算符

符号范例
+ $z = $x+$y
$x$y相加之后,再将果指派$z
- $z = $x-$y $x减掉$y之后,再将果指派$z
* $z = $x*$y $x$y相乘之后,再将果指派$z
/ $z = $x/$y $x除以$y之后,再将商数指派$z
% $z = $x%$y $x除以$y之后,再将余数指派$z
** $z = $x**$y $x乘以$y之后,再将果指派$z
++ $x++;
++$x;
如同$x=$x++1;$x加一以后再将果指派$x
-- $x--;
--$x;
如同$x=$x-1;$x减一以后再将果指派$x
. $z = $x.$y 将$x字符串和$y字符串接之后,再将果指派给$z

  数值(Numeric Values)系运算符

符号 范例
> $x > $y 如果$x大于$y,返回1值,返回0
>= $x >= $y 如果$x大于等于$y,返回1值,返回0
< $x < $y 如果$x小于$y,返回1值,返回0
<= $x <= $y 如果$x小于等于$y,返回1值,返回0
== $x == $y 如果$x等于$y,返回1值,返回0
!= $x != $y 如果$x不等于$y,返回1值,返回0
<=> $x <=> $y 如果$x大于$y,返回1值,如果$x等于$y,返回0;&127;如果 $x
于$y,返回-1

  字符串(String Values)系运算符

符号 范例
gt $str1 gt $str2 如果$str1大于$str2,返回1值,返回0
ge $str1 ge $str2 如果$str1大于等于$str2,返回1值,返回0
lt $str1 lt $str2 如果$str1小于$str2,返回1值,返回0
le $str1 le $str2 如果$str1小于等于$str2,返回1值,返回0
eq $str1 ep $str2 如果$str1等于$str2,返回1值,返回0
ne $str1 ne $str2 如果$str1不等于$str2,返回1值,返回0
cmp $str1 cmp $str2 如果$str1大于$str2,返回1值,如果$str1等于$str2,返回0,
果$str1小于$str2,返回-1

  逻辑(Logical)运算

  1 $x&&$y(And)

   $x $y

   真(True) 真(True) 真(True)

   真(True) 假(False) 真(True)

   假(False) 真(True) 假(False)

   假(False) 假(False) 假(False)

  2 $x||$y(Or)

   $x $y

   真(True) 真(True) 真(True)

   真(True) 假(False) 真(True)

   假(False) 真(True) 真(True)

   假(False) 假(False) 假(False)

  3 $x(Not)

   $x

   真(True) 假(False)假(False) 真(True)

  其它常用的运算符

   指令:..运算符(Range Operator)

   明:个运算符是Perl言中特有的运算符,是一个很用的运算符.

  范例:

   @digits=(1..9); #时@digits=(1,2,3,4,5,6,7,8,9);
   @digits=('01'..'05'); #时@digits=(01,02,03,04,05);
   @char=('A'..'E'); #时@char('A','B','C','D','E',);
   @total=(1..3,'A'..'B'); #时@total=(1,2,3'A','B');

  指令: 运算式?运算1:运算式2 条件运算符(Conditional Operator)

  明: 法的意和C言一样,如果判运算式的是真(True)话,做运算
,1的运算,如果判运算式是假(False)话,做运算式2的运算.

  范例:

   $price=($age>60)? 100:200;
   如果$age大于60话,则$price等于100,则$price等于200.


  常用的文件数据(File test)运算符

  范例

   -r $file 如果$file是可取的话,返回1
   -w $file 如果$file是可写入的话,返回1
   -x $file 如果$file是可行的话,返回1
   -e $file 如果$file存在的话,返回1
   -o $file 如果$file是被行才所有的话,返回1
   -s $file 返回$file的文件大小(bytes)
   -f $file 如果$file是正常文件的话,返回1
   -T $file 如果$file是文本文件的话,返回1
   -B $file 如果$file是Binary文件的话,返回1
   -M $file 返回$file文件最后一次更改时间在的日期
 
 
阅读(740) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~