文档库 最新最全的文档下载
当前位置:文档库 › perl基础语法

perl基础语法

perl基础语法
perl基础语法

一.数据类型(Data type)

Perl 的数据类型大致分为四种:Scalar(变量)、Scalar Array(数组)、Hash Array(散列)、References(指针),看起来虽少但用起来却绰绰有余。尤其在写Perl程序时可以不必事先宣告变量,这一点对刚学程序语言的人甚为方便,不过为了以后程序除错和维护方便,我建议你还是养成事先声明变量的习惯比较好。

1 Scalar(纯量变量)

纯量变量是Perl里最基本的一种数据型态,它可以代表一个字符、字符串、整数、甚至浮点数,而Perl把它们都看成是一样的东东! 你甚至可以混着用,不可思议吧。例如:

# 井字号开头的后面都是批注。

# 纯量变数以$开头。

# my 是一种宣告变量的方式,它可以使变量区域化。

# 宣告变量时若不加my 或local 则Perl会把它当作全域变量使用。

# 习惯上,我们会将字符串用双引号括起来,而数值就不用加引号。

my $x="abc";

my $x=123;

my $x=4.56;

1、算术运算符

+(加)、-(减)、*(乘)、/(除)、**(幂)、%(余)、-(负)

(1)求幂(**)结果不能超出数的范围。当指数为小数时,底数不能为负数,例如:25**1.5=125,(-25)**1.5=?(不成立)(2)取余(%)操作数为整数,否则要截取。第二个数不能为0(因为除数不能为0)

(3)负(-)-$a=$a*(-1)

此外,注意当一个字符串参加运算,需要转化为整数时,如果不能转化为整数则值为0。例如:'2'+1=3,'a'+1=1

2、数字比较运算符

<(小于)、=(等于)、>(大于)、==(等于)、<=(小于等于)、>=(大于等于)、!=(不等于)、<=>(比较)(1)==:比较运算,比较的结果为真或非零,假或零

(2)<=>:比较运算例如:$a<=>$b,当$a>$b时,值为1;当$a<$b时,值为-1;当$a==$b时,值为0

(3)自动把操作数转化为整数,不能转化为整数则为0

(4)浮点数不精确,不要把值相近的数比较,否则得到的结果是出乎意料的

3、字符串比较运算符

lt(小于)、gt(大于)、eq(等于)、le(小于等于)、ge(大于等于)、ne(等于)、cmp(比较)

(1)字符串的比较原则:按照字母表的顺序比较,数字<大写字母<小写字母(a小—z大)

(2)字符串比较的次序:字符串从左到右比较。'azz'<‘bc'(即:首先a与b进行比较,然后z与c进行比较)

(3)当一个串是另一个的前缀时,长度长的为大。例如:dog

(4)字符串可以从右向左进位,且是字母数字分别进行

(5)自动把操作数转化为字符串。123 lt 45 => '123' lt '45'

(6)cmp等同于<=>,结果为-1,0, 1

例如:$str1=”a”,$str2=”a“,则print ($str1 cmp $str2) ==> 0

例如:$str1=”a”,$str2=”b”,则print($str1 cmp $str2)===> -1

例如:$str1=”b”,$str2=”a”,则print($str1 cmp $str2)===> 1

(7)空串,0,Undef,这三种情况都为假

例如:如下比较的结果

35 != 30+5 #假

35 == 35.0 #真

'35' eq '35.0' #假(当成字符串来比较)

'fred' lt 'barney' #假

'fred' lt 'free' #假

'fred' eq "fred" #真

'fred' eq "Fred" #假

' ' gt ' ' #真

4、字符串连接(.)、字符/字符串重复(x)

(1)连接(“.“)

例如:$a=‘a'.'b'; =>‘ab' 在print时可以直接写print $a$b=>print $a.$b; 但是这两者的原理是不一样的(2)重复(“x”),注意:前后有空格(目的:为了和变量名分开)

例如:‘a' x 5=‘aaaaa',若重复次数<1,则返回空串

例如:"5" x 4,即为:"5555"

例如:"love" x (4+1),即为:"lovelovelovelovelove"

例如:"4.8" x 4,即为:"4.84.84.84.8"

例如:6.1 x 3,即为:"6.16.16.1"

即:左边是一个字符串,右边是该字符串出现的次数

5、逻辑运算符(&&(and)(与)、||(or)(或)、!(not)(非)、xor(异或)

(1)先算左边的值,后算右边的值

(2)&&和and的优先级不同,但除非特殊情况,很难有区别

6、位操作运算符

&(按位与)、|(按位或)、~(按位非)、^(按位异或)、<<(左移)、>>(右移)

(1)操作数为二进制整数,如果是小数则截取为整数

(2)<<左移,移开后空位补0,值为原数值的2*N倍(例如:z<<4,则z=z*(2的4次方))

(3)>>右移,首位补0,值为原值一半(并取整)(例如:z>>4,则z=z/(2的的次方))

7、赋值运算符

=、+=、-=、*=、/=、%=、**=、&=、|=、^=、.=

(1)$a+=1=>$a=$a+1

(2)可以连等$a=$b=3;=>$a=3;$b=3;

(3)混用($a=$b)+=3;=>$a=$b;$a=$a+3;(不建议使用)

8、自增(++)、自减(--)

(1)不要在变量两边都使用此种操作符:++$var--

(2)不要在变量自增/减后在同一表达式中再次使用:$var2 = $var1 + ++$var1;

(3)可用于字符串的自增,当z、Z、9时进位。$a=‘caz'; $a++; ==> $a=‘cba';

(4)不能用于字符串的自减,当$a--时,按数字运算,字符先转化为0再自减

(5)如果字符串含有非字母数字符号,或数字位于字母中时,自增也先化为0再自增

例如:$a=‘ab*c'; $a++; ==> $a=1;

例如:$a=‘ab5c'; $a++; ==> $a=1;

(6)预增$b=++$a,$a先自增再赋值,后增$b=$a++;$a先赋值再自增;反之,同理

例如:$a=1; $b=++$a; =>$a=2,$b=2;

例如:$a=1; $b=$a++; =>$a=2,$b=1;

(7)只能用于单一变量,不能对运算后的变量进行。例如:($a+$b)++

9、逗号(相当于:将两条语句写在一行)

适用范围:只有当两个语句关联紧密时才使用

例如:$a+=1,$b=$a; => $a+=1; $b=$a;

例如:$a="ab5c", print $a."\n";

10、条件运算符(条件?真:假)

(1)三个操作数:先对条件表达式运算,为真时执行:的左边的运算,为假时执行:的右边的运算例如:$result = $var == 0 ? 14 : 7;

(2)用于简单的条件

(3)条件表达式用在=的左边

例如:$condvar == 43 ? $var1 : $var2 = 14;

例如:$condvar == 43 ? $var1 = 14 : $var2 = 14;

11、操作符优先级别(precedence--优先级)

当一个表达式中出现几种不同的运算符,哪个先计算,哪个后计算

例如:$condvar == 43 ? $var1 : $var2 = 14;(先算条件,后算赋值)

例如:$x = $a == $b;(先算关系,后算赋值)

例如:$x == 0 || $y / $x > 5;(先算除,接着算大于、接着算等于,最后算关系或)

例如:$result = 11 * 2 + 6 ** 2 << 2;(先算幂,再算乘,接着算加,再接着算左移,最后算赋值)

(1)一般的优先级如下:自增自减最高,单操作数高于多操作数,数字运算> 比较运算(数字比较与字符串比较)> 位运算> 赋值运算> 逻辑运算

(2)数字运算:幂> */>+-

(3)比较运算:<(小于)、>(大于)高于(== 与!=)

2 Scalar Array

Perl数组变量和列表的概念,列表是包含在括号里的一序列的值,可以为任何数值,也可为空,并且列表存贮于Perl数组变量中,与简单变量不同,Perl数组变量以字符"@"打头。

列表可以为任何数值,也可为空

例如:(1,5.3,"hello",2) (17,$var,"astring") (17,26<<2) (17,$var1+$var2) ($value,"Theansweris$value") 空列表:()。注:只含有一个数值的列表如:(43.2)与该数值本身即:43.2是不同的,但它们可以互相转化或赋值。

列表存储于数组中: @array=(1,2,3);

注:(1)Perl数组变量创建时初始值为空列表:()。

(2)因为PERL用@和$来区分Perl数组变量和简单变量,所以同一个名字可以同时用于Perl数组变量和简单变量

例如:$var=1; @var=(11,27.1,"astring"); 但这样很容易混淆,故不推荐。

1、Perl数组的存取

(1)对Perl数组中的值通过下标存取,第一个元素下标为0。试图访问不存在的Perl数组元素,则结果为NULL,但如果给超出Perl数组大小的元素赋值,则Perl数组自动增长,原来没有的元素值为NULL。

例如:@array=(1,2,3,4);

$scalar=$array[0];

$array[3]=5; #now @array is (1,2,3,5)

$scalar=$array[4]; #now $scalar=null;

$array[6]=17; #now @array is (1,2,3,5,"","",17)

(2)Perl数组间拷贝, @result=@original;

(3)用Perl数组给列表赋值

例如:@list1=(2,3,4);

@list2=(1,@list1,5); #@list2=(1,2,3,4,5)

(4)Perl数组对简单变量的赋值

例如:@array=(5,7,11);

($var1,$var2)=@array; #$var1=5, $var2=7, 11被忽略

@array=(5,7);

($var1,$var2,$var3)=@array; #$var1=5,$var2=7,$var3=""(null)

(5)从标准输入(STDIN)给变量赋值

例如:$var=;

@array=; #^D为结束输入的符号

2、字符串中的方括号和变量替换

"$var[0]"为Perl数组@var的第一个元素。

"$var\[0]"将字符"["转义,等价于"$var"."[0]",$var被变量替换,[0]保持不变。

"${var}[0]"亦等价于"$var"."[0]"。

"$\{var}"则取消了大括号的变量替换功能,包含文字:${var}.

3、列表范围

(1)用于实数:(2.1..5.3)=(2.1,3.1,4.1,5.1) (4.5..1.6)=() (2,5..7,11)=(2,5,6,7,11) (3..3)=(3)

(2)用于字符串:("aaa".."aad")=("aaa","aab","aac","aad") @day_of_month=("01".."31")

(3)可包含变量或表达式:($var1..$var2+5)

(4)小技巧:$fred="Fred"; print(("Hello,".$fred."!\n")x2);

其结果为:Hello,Fred!

Hello,Fred!

4、Perl数组的输出:

(1)@array=(1,2,3);

print(@array,"\n");

结果为:123

(2) @array=(1,2,3);

print("@array\n");

结果为:123

5、列表/Perl数组的长度

当Perl数组变量出现在预期简单变量出现的地方,则PERL解释器取其长度。

@array=(1,2,3);

$scalar=@array; #$scalar=3,即@array的长度

($scalar)=@array; #$scalar=1,即@array第一个元素的值

注:以Perl数组的长度为循环次数可如下编程:

$count=1;

while($count<=@array){

print("element$count:$array[$count-1]\n");

$count++;

}

6、子Perl数组

@array=(1,2,3,4,5);

@subarray=@array[0,1]; #@subarray=(1,2)

@subarray2=@array[1..3]; #@subarray2=(2,3,4)

@array[0,1]=("string",46); #@array=("string",46,3,4,5)now

@array[0..3]=(11,22,33,44); #@array=(11,22,33,44,5)now

@array[1,2,3]=@array[3,2,4] ;#@array=(11,44,33,5,5)now

@array[0..2]=@array[3,4]; #@array=(5,5,"",5,5)now

可以用子Perl数组形式来交换元素:

@array[1,2]=@array[2,1];

7、有关Perl数组的库函数

(1)sort--按字符顺序排序

@array=("this","is","a","test");

@array2=sort(@array);#@array2=("a","is","test","this")

@array=(70,100,8);

@array=sort(@array);#@array=(100,70,8)now

(2)reverse--反转Perl数组

@array2=reverse(@array);

@array2=reversesort(@array);

(3)chop--Perl数组去尾

chop的意义是去掉STDIN(键盘)输入字符串时最后一个字符--换行符。而如果它作用到Perl数组上,则将Perl数组中每一个元素都做如此处理。

@list=("rabbit","12345","quartz");

chop(@list);#@list=("rabbi","1234","quart")now

(4)join/split--连接/拆分

join的第一个参数是连接所用的中间字符,其余则为待连接的字符Perl数组。

$string=join("","this","is","a","string");#结果为"thisisastring"

@list=("words","and");

$string=join("::",@list,"colons");#结果为"words::and::colons"

@array=split(/::/,$string);#@array=("words","and","colons")now

3 Hash Array(Associative Array):

perl hash 常见用法

基本用法

# 初始化%h为空数组%h = {};# 用数组初始化%h为a=>1, b=>2%h = ('a', 1, 'b', 2);# 意义同上,只是另一种更形象化的写法。%h = ('a'=>1, 'b'=>2);#如果key是字符串,可以省略引号。下面这行和上面那行是一样的%h = (a=>1, b=>2);# 用{}来访问print "$h{a}\n"; # 打印1$h{b} = '2b';print "$h{b}\n"; # 打印2b# 删除key用deletedelete $h{b}; # 从$h删除'b'

清空hash

undef %h

得到hash的所有键值

# 得到所有keys,顺序取决于hash函数,或者说是乱序

@all_keys = keys %h;

# 所有键值,是按hash的值从大往小排列的。值的比较是数字比较(比如说,10>9)

@all_keys = sort{$h{$b}<=>$h{$a}} (keys %h);

# 所有键值,是按hash的值从小往大排列的。值的比较是数字比较

@all_keys = sort{$h{$a}<=>$h{$b}} (keys %h);

# 所有键值,是按hash的值从小往大排列的。值的比较是字符串比较(比如说,'10' < '9')

@all_keys = sort{$h{$a} cmp $h{$b}} (keys %h);

判断hash是否包含key

exists($h{$key});

Hash的长度

想要知道一个hash存放多少数据

$hash_size = keys %h

# 把%h的长度放到$hash_size中

print scalar kes %h, "\n"

# 打印%h的长度。这里用了scalar来返回数组长度。

遍历一个hash

while (my ($k, $v) = each %h) {print "$k ---> $v\n";}

Reference引用

Reference类似于C/C++的指针

$h_ref = \%h;

# 获得一个hash的reference%aHash = %{$h_ref};

# 把hash reference当成hash用$value = $h_ref->{akey}

# 这个和%h{akey}是一样的

传递hash到函数

一般都是传递一个reference到函数

%h = ();$h{a}=1;foo(\%h)print $h{b}, "\n";

# 打印出2。

这个值来自于函数foo() sub foo {my ($h) = @_;print $h->{a}, "\n";

# 打印出1$h->{b} = 2;}

函数返回hash,或者hash引用(hash reference)

函数可以返回hash

sub foo {my %fh;$fh{a} = 1;return %h;} my %h = foo();print

二控制结构(Control Statements)

1 选择if结构

Perl的条件控制叙述和C语言很像,让使用者很快就能掌握它。不过Perl比C语言又另外多了些实用的语法,我用底线标出来,大家一看便知。

# Expression 就是条件叙述式,Perl和C一样没有定义布尔数据型态(Boolean datatype),

# 因此0 是false、非0 是ture。另外要注意字符串运算子和数值运算子要分清楚哦。

# Code Segment 就是用大括号括起来的一堆指令,也就是一个Block。

if (Expression) {Code Segment}

if (Expression) {Code Segment} else {Code Segment}

if (Expression) {Code Segment} elsif (Expression) {Code Segment} else {CodeSegment}

# elsif 就是else if

# 如果指令(statement)只有一项,我们可以使用倒装句法,看起来比较简洁。

statement if (Expression);

# unless 就是if not

statement unless (Expression);例:

print "HELLO!\n" if ($name eq "friend");

$x-=10 if ($x == 100);

看吧! C 语言有的Perl大部分都有,学过C 的人可以毫不费力的学会Perl。

2循环结构

Perl的循环控制叙述也和C语言很像,当然,照例Perl也另外多了些实用的语法:

# 注意:纯量变数前面要加个$ 字号,这一点和C语言不一样哦。

for($i=0; $i<=10; $i++) {Code Segment}

# foreach 是承袭UNIX的shell script来的,

# 第一个自变量是纯量变数,第二个自变量要用括号括起来,里面是一个纯量数组,

# 顾名思义它就是把数组中的每个元素依序传给第一个自变量,直到全部传完。

# 它和for($i=0; $i<=$#array; $i++) 用法虽然不同,但目的都是要取出数组的每个元素。

foreach $i (@array) {Code Segment}

# 其实在Perl中,for和foreach是可以混着用的,就看个的人习惯了。

# 下面这行就等于上面第一个叙述,不过简洁多了,大家可以试着用用看。

for $i (0..10) {Code Segment}

# while控制循环和后置循环。

while($i<=10) {Code Segment}

do {Code Segment} while(Expression);

# Perl也有和C语言的break和continue一样的指令,Perl叫它做last 和next (较口语化)。

# last是跳出现在所在的循环,next则是跳过下面的指令直接执行下一次的循环。

while(chomp($i=)) {

next if ($i == 5);

last unless ($i > 10);

}

Perl 还有提供label(标记)的语法,也就是goto 指令,不过有经验的programer并不喜欢用它,我也不建议大家使用,所以就此按下不讲。有兴趣的人请自行查阅。还有一点值得注意的是Perl没有提供像C语言一样的switch 叙述,不过Perl的pattern match 的功能非常强,所以我建议你直接用if else 叙述来做就好了。

3子程序(Subroutines)

(a) Syntax: sub NAME {Code}

(b) 呼叫子程序:&NAME(para1, para2,...)

(c) 参数传递:@_

Perl 和C一样是采用Call by value的方式,不过因为Perl不用事先宣告变量,所以建立子程序的时候也不用宣告要传递什么参数。当主程序在传递参数给子程序时,Perl会把括号括起来的参数按顺序放在一个特殊的全域变量@_ 数组中,然后子程序就可以随意使用数组@_ 里的参数,例如$_[0] 是第一个参数,$_[1] 是第二个,或是用my($a1,$a2,$a3,...) = @_;来取出各个参数,当然my @arg=@_; 或my %arg=@_; 也是可以的。由于Perl的语法非常活泼,使得程序在维护时特别棘手,因此写批注成为一项很重要的工作。我建议你最好在每个子程序前面加上对这段子程序的描述,特别是需要传递的参数要注明清楚。

(d) Variable Localization:my or local

通常我们在程序中定义的变量都是全域变量,所以在子程序中若要把变量区域化则要加上my 或local 关键词,例如:my $x=3;,若子程序所用的变量名不小心和主程相同,Perl会以目前正在执行的子程序里的变量为优先。

三.I/O和档案处理

(a) Syntax:

open(FILEHANDLE,"Expression");

close(FILEHANDLE);

这里的Expression是一个叙述加上文件名称,若Expression只有文件名称没有加上叙述,则预设是只读。Expressions叙述如下:Expression Effect

open(FH, " filename")

open(FH, "+filename")

open(FH, ">filename") Opens filename for writing.

open(FH, "+>filename") Opens filename for both reading and writing.

open(FH, ">>filename") Appends to filename.

open(FH, "command|") Runs the command and pipes its output to thefilehandle.

open(FH, "command|") Pipes the output along the filehandle to thecommand.

open(FH, "-") Opens STDIN.

open(FH, ">-") Opens STDOUT.

open(FH, "<&=N") Where N is a number, this performs the equivalent of C'sfdopen for reading.

open(FH, ">&=N") Where N is a number, this performs the equivalent of C'sfdopen for writing.

例:

# 开启$filename这个档案,若开启失败则印出die后面的讯息,并结束程序。

open(FILE, $filename) || die "Can't open file $filename : $!\n";

# 下面是一个十分精简的写法,和while($_=){print "$_";} 是等效的。

print while();

# 档案开启后要记得随手关闭,这才是写程序的好习惯。

close(FILE);

# $!和$_都是Perl的特殊变数,下面会介绍的。

(b) Input:

Perl没有特别用来输入的函数,因为Perl在执行程序时,会自动开启标准输入装置,其filehandle定为STDIN,所以在Perl中要输入数据的方法就是使用:

# Perl不会自动去掉结尾的CR/LF,跟C语言不同,所以要用chomp函数帮你去掉它。

# 大家常常会忘记这个动作,导致结果跟你想的不一样,要特别注意一下。

$input=; chomp $input;

# 下面是较简洁的写法。

chomp($input=);

(c) Output:print "variables or 字符串";

Perl也有printf()函数,语法和C语言一模一样,我就不多做介绍了。Perl另外有个print函数,比printf()更方便、更好用,包你爱不释手。Output不外乎是输出到屏幕或档案,用例子来说明比较容易了解。

# 不用再指定变量的data type,这样不是比printf()方便多了吗?

print "Scalar value is $x\n";

# . 是字符串加法的运算子,上下这两行是等效的。

print "Scalar value is " . $x . "\n";

# 输出到档案的方法。

print FILE "print $x to a file.";

# 下面是print的特殊用法,学自shell script的用法:

print

这招叫做here document,XXX可以是你取的任何标识符,在标识符之间的字都会按照你所写的样子输出,就像\标签一样。而当一行的开头是XXX你取的这个标识符时,才会停止输出。

XXX

Perl 也有和C 一样以"\" 开头的特殊字符:

\t tab

\n newline

\r return

\f form feed

\b backspace

\a alarm(bell)

\e escape

\033 octalchar

\x1b hex char

\c[ control char

\l lowercase next char

\u uppercase next char

\L lowercase till \E

\U uppercase till \E

\E end case modification

\Q quoteregexp metacharacters till \E

另外需要说明的是Perl 融合了unix shell script的使用惯例,以双引号("")括起来的字符串会先经过展开,但反斜线(\)后面的字符则不展开,当作一般字符看待。而以单引号('')括起来的字符串完全不会展开,以反单引号(``)括起来的字符串会把它当作命令列指令一样执行,等于system()一样。初学者常常会搞混,但习惯之后就会觉得不这样分清楚反而不行哩,举个例吧:

$x="ls -l";

print "$x"; # Output ls -l

print "\$x"; # Output $x

print '$x'; # Output $x

print `$x`; # Output files in this directory

四.函数

1. Perl函数

通过& 调用.

2. Perl参数

Perl天然支持可变数目个参数。

在函数内部,所有参数按顺序放在数组@_ 中,在函数内部,$_[0] 表示函数的第一个

参数,其余类推。

3. shift

shift 后跟一个数组,表示将数组的第一个值返回。数组也被改变,其第一个元素被弹出。

演示代码一(求最大值):

#!/usr/bin/perl -w

use strict;

# 调用函数max,取得一组数值的最大值,并输出。

my $maxCnt = &max(11,22,33);

print "maxCnt=$maxCnt\n";

sub max {

# 采用遍历算法。先将参数中的第一个值赋给$currentMaxCnt。

# @_ 是默认的包含本函数所有参数[如(11,22,33)]的数组。

# shift @_ 有两个结果: 1. 将数组@_ 中的第一个值做为返回值(赋给了$currentMaxCnt). 2. 将@_数组第一个值弹出[此后@_的值变为(22,33)].

my $currentMaxCnt = shift @_;

# 函数中使用shift时,@_可以省略。上面代码也可以写成这样。

# my $currentMaxCnt = shift;

# 遍历整个@_数组。

foreach ( @_ ) {

# $_ 表示数组@_中当前被遍历到的元素.

if ( $_ > $currentMaxCnt ) {

# 如果发现当前数组元素比$currentMaxCnt大,那就将$currentMaxCnt重新赋值为当前元素。

$currentMaxCnt = $_;

}

}

# 函数返回值为标量$currentMaxCnt.

return $currentMaxCnt;

}

演示代码二(求和):

#!/usr/bin/perl -w

use strict;

# 求一组数的和并打印。

my $s1 = &sumvar(11,22,33);

my $s2 = &sumarg(22,33,44);

my $s3 = &sumgod(11,22,33,44,55);

print "s1=$s1, s2=$s2, s3=$s3\n";

# 办法1

sub sumvar {

# 将参数数组的前三个元素值相应地赋给($first, $second, $third)

(my $first, my $second, my $third) = @_;

# 返回其和值。缺点: 如果是求四个参数的和,依然只能给出前三个的和。return $first + $second + $third;

}

# 办法2

sub sumarg {

# $_[0] 表示参数数组@_的第一个元素。其余类推。

my $first = $_[0];

my $second = $_[1];

my $third = $_[2];

# 返回其和值。缺点: 同sumvar. 只是通过这里学习$_[0] 这种用法。return $first + $second + $third;

}

# 办法3, 参数可以任意多。都能求其和。

sub sumgod{

my $s = shift @_;

foreach ( @_ ) {

$s = $s + $_;

}

# 同前面函数max。

return $s;

}

五.总结

整理了一下自己觉得用的比较多的一些符号、用法、函数、库之类的,这些都是很基本的,但是“背熟”了,对提高效率会很有帮助。

数据操作

* $ - 声明与引用用一个scalar的变量

* @ - 声明与引用一个list,但是当访问一个list的成员时,需使用$ListName[index] * % - 声明与引用一个hash表,但是当访问一个hash的成员时,需要使用$HashName {key}

特殊变量

* $0 - 当前运行脚本的文件名

* @ARGV - 当前运行脚本的命令行参数列表

* $_ - 默认变量,如循环中的当前变量

* @_ - 函数的输入参数列表

* %ENV - 系统的环境变量

* @INC - Perl的Include路径列表,我们可以往该列表中添加我们自己的目录来方便引用自定义的库

* $! - 当前系统提示,错误信息

* $^O - 操作系统的名字

* STDIN,STDOUT,STDERR - 输入输出的默认句柄,可以作一定的自定义

* => - 声明一个hash时可以用来明确的表示出key=>value的对应关系

* $^I- 指定备份的文件的后缀名,如此,被修改的文件将会自动以该后缀名保存一个副本

特殊用法

* &Sub - 调用一个函数,虽然Perl有些规则让你在某些时候可以省略这里的&符号,但是处于一致性考虑,所以自定义的函数的调用,我一律采用此种方式。

* $# - 用来取得模个数组的最大index, 一般情况下,也可以用-1来表示最后一个元素的index的

* qw() - 快速声明一个字符串数组,可以省略那些烦人的引号

正则表达式

* $ - 获取被括号捕获的匹配

* $`, $&, $' - 获取匹配的字符串,以及其前后两个部分

* ^,$ - 字符串的始末位置,用作定位

常用函数

* pop, push, shift, unshift, reverse - list的操作函数

* keys,values, exists, each, delete - hash的操作函数

* chomp, split, join, index, substr, sort - 字符串操作函数

* sprintf,printf, print - 格式化输出函数

* system, exec, `` - 系统命令调用函数

* glob, unlink, mkdir, rmdir, rename,chmod,chown, open, close, opendir, closedir - 文件系统操作函数

* stat, lstat,localtime,gmtime,utime - 文档属性,时间相关函数

* hex, oct - 二进制,八进制,十六进制数转化成十进制的函数

* grep, map - list高级操作函数

这些函数的详细介绍,都可以通过命令:

#perldoc -f functionname

查到

常用库

* File::Basename - 根据path获取文件名或者文件路径

* File::Spec - 根据文件名与路径组合成全路经

* File::Find - 递归遍历某个目录下所有文件

* XML::Simple - 以一个复杂的结构来表示xml文件,使用起来相当方便* Time::HiRes - 经常用来计算一个操作所耗费的时间

* Getopt::Long - 当脚本需要复杂的输入参数与选项时用到

* Cwd - 拿到当前工作目录

* IO::File - 文件操作

* Win32 - 当需要调用一些Windows API时我会用它

Edify语法简介

最近在学习ROM定制,在Updater-Script语法上花了很多时间,找了不少资料,都不是很完整。 后来无意中找到一篇英文文档,就整理了一下,必进行了翻译。 原地址:https://www.wendangku.net/doc/1c19050469.html,/guide/introdution_to_edify 水平有限,难免有误,请高手们见笑。 详细内容如下: Edify语法简介(Updater-Script) 翻译:Kawvin 这是Android系统来运行updater-scripts的Edify语言的基本介绍。 大部分的Edify命名都是函数,当调用这些函数结束的时候,会返回数据给脚本。当然,你也可以使用这些函数的返回值来确认成功与否,例如: ifelse(mount("yaffs2", "MTD", "system", "/system") == "system", ui_print("Successfully Mounted!"), ui_print("Mount Failed!"); 这个命令会尝试去挂载命名为“system”的“MTD”分区到“/system”。如果挂载成功,脚本会显示“Successfully Mounted!”,否则会显示“Mount Failed!”。 现面是用在Edify的Updater-script中的函数例子: 函数名称: mount 函数语法: mount(fs_type, partition_type, location, mount_point) 参数详解: fs_type-----------------"yaffs2" 或 "ext4" partition_type----------"MTD" 或 "EMMC" location-----------------分区(partition) 或驱动器(device) mount_poin------------挂载文件系统的目标文件夹(target folder to mount FS) 作用解释: 挂载一个文件系统到指定的挂载点 返回值: 挂载成功则返回挂载点,失败返回null 函数示例: mount("MTD", "system", "/system");挂载system分区,设置返回指针"/system” mount("vfat", "/dev/block/mmcblk1p2", "/system"); 挂载/dev/block/mmcblk1p2,返回指针"/system”

GAWK入门

GAWK 入门:AWK 语言基础 利用GAWK 的开放源代码实现学习AWK 了解A WK 文本处理和模式扫描语言的基本概念。本教程将带您开始使用A WK 进行编程:您将了解A WK 如何读取输入数据和对其进行排序、如何运行A WK 程序、操作数据并进行复杂的模式匹配。当您完成本教程的学习时,同时也了解了GNU A WK (GA WK)。 开始之前 了解本教程中介绍的内容、如何最好地利用它以及在学习本教程的过程中需要完成哪些工作。 关于本教程 GNU A WK (GAWK) 是历史悠久的A WK 编程语言的开放源代码实现,可用于所有的UNIX? 系统。A WK 语言是一种UNIX 备用工具,它是一种功能强大的文本操作和模式匹配语言,特别适用于进行信息检索,这使得它非常适合用于当今的数据库驱动的应用程序。因为它集成于UNIX 环境,所以可以设计、构建和快速地执行完整的工作程序,并且立即就能得到结果。 本教程为A WK 文本处理语言提供了实践性的介绍。它介绍了如何使用开放源代码GA WK 解释器来编写和执行A WK 程序,以便通过各种方式来搜索和操作数据。 目标 本教程面向那些需要利用A WK 强大的文本操作功能的读者。在本教程中,您将使用GA WK,以了解各种运行A WK 程序的方法。您还将了解如何组织程序,并学习A WK 的记录和字段范例。在完成本教程后,您可以学习到该语言的基本内容,包括格式化输出、记录和字段操作以及模式匹配。您还应该能够编写自定义的A WK 程序,以使用UNIX 命令行执行复杂的文本处理。 先决条件 本教程没有特殊的先决条件,不过您应该熟悉UNIX 命令行Shell 的使用。如果您对 C 编程语言的构造比较熟悉,那么将会很有帮助,但这并不是必需的。 系统要求 您必须在系统中安装GA WK 的工作副本,最好是V ersion 3.0 或更高版本。很容易获得GA WK 的源代码和二进制包。如果您使用源代码安装GA WK,请参考GA WK 源代码分发版中的README 文件,其中列出了进行成功的编译和安装所需的任何附加软件。

Json数据格式的使用方法入门教程

JSON 数据格式解析 和 XML 一样,JSON 也是基于纯文本的数据格式。由于 JSON 天生是为JavaScript 准备的,因此,JSON 的数据格式非常简单,您可以用 JSON 传输一个简单的 String,Number,Boolean,也可以传输一个数组,或者一个复杂的Object 对象。 String,Number 和 Boolean 用 JSON 表示非常简单。例如,用 JSON 表示一个简单的 String “ abc ”,其格式为: "abc" 除了字符 ",\,/ 和一些控制符(\b,\f,\n,\r,\t)需要编码外,其他 Unicode 字符可以直接输出。下图是一个 String 的完整表示结构: 图 1. String 的完整表示结构 一个 Number 可以根据整型或浮点数表示如下:

图 2. Number 的表示结构 这与绝大多数编程语言的表示方法一致,例如: 12345(整数) -3.9e10(浮点数) Boolean 类型表示为 true 或 false 。此外,JavaScript 中的 null 被表示为 null,注意,true、false 和 null 都没有双引号,否则将被视为一个String 。 JSON 还可以表示一个数组对象,使用 [] 包含所有元素,每个元素用逗号分隔,元素可以是任意的 Value,例如,以下数组包含了一个 String,Number,Boolean 和一个 null: Object 对象在 JSON 中是用 {} 包含一系列无序的 Key-Value 键值对表示的,实际上此处的 Object 相当于 Java 中的 Map,而不是Java 的 Class 。注意 Key 只能用 String 表示。 例如,一个 Address 对象包含如下 Key-Value:

Linux操作系统基础教程

Linux操作系统基础教程 清华大学信息学院计算机系 目录 前言 (2) 第一讲 Linux基础 (2) 一.什么是Linux? (2) 二.安装Linux的好处? (3) 三.如何得到Linux? (3) 四.如何得到Linux的最新消息? (3) 五.Linux操作系统上有什么应用? (4) 六.在那里可以找到讨论区? (5) 七.安装过程 (5) 第二讲 Linux基础进阶 (5) 一.Linux的文件系统结构 (6) 二. 文件类型 (7) 三.Linux基本操作命令 (8) 四.基本的系统管理命令 (14) 五.关於 Process 处理的指令 (16) 六. 关於字串处理的指令 (17) 七. 网路上查询状况的指令 (17) 八. 网路指令 (18) 九. 关於通讯用的指令 (21) 十. 编译器( Compiler ) (22) 十一. 有关列印的指令 (22) 第三讲 Linux下的网络服务,配置问题和常用工具 (24) 一.Linux下的网络服务 (24) 二.几种重要的配置文件 (26) 三.Linux下常用的工具软件 (28) 尾语 (31)

前言 Linux是在1991年发展起来的与UNIX兼容的操作系统,可以免费使用,它的源代码可以自由传播且可任人修改、充实、发展,开发者的初衷是要共同创造一个完美、理想并可以免费使用的操作系统。 我们并不能使同学们通过这次系列讲座成为一个UNIX类操作系统的高手,这次系列讲座的目的就是在同学们中间普及Linux基础知识,为今后我们更加接近的了解Linux做一个好的开端。 第一讲 Linux基础 在这一讲中,我们主要是了解一下Linux的概况,以及对Linux有一个初步的感性认识。 一.什么是Linux? Linux是一个以Intel系列CPU(CYRIX,AMD的CPU也可以)为硬件平台,完全免费的UNIX兼容系统,完全适用于个人的PC。它本身就是一个完整的32位的多用户多任务操作系统,因此不需要先安装DOS或其他的操作系统(MS Windows, OS2, MINIX..)就可以进行直接的安装。Linux的最早起源是在1991年10月5日由一位芬兰的大学生Linux Torvalds (Torvalds@kruuna.helsinki.fi)写了Linux核心程序的0.02版开始的,但其后的发展却几乎都是由互联网上的Linux社团(Linux Community)互通交流而完成的。Linux不属于任何一家公司或个人,任何人都可以免费取得甚至修改它的源代码(source code)。Linux上的大部分软件都是由GNU倡导发展起来的,所以软件通常都会在附着GNU Public License(GPL)的情况下被自由传播。GPL是一种可以使你免费获得自由软件的许可证,因此Linux使用者的使用活动基本不受限制(只要你不将它用于商业目的),而不必像使用微软产品是那样,

PetaPoco入门

首页 - 网络编程 - https://www.wendangku.net/doc/1c19050469.html, PetaPoco入门(二) 2013-06-02 12:34:https://www.wendangku.net/doc/1c19050469.html,-冷月TinyHU- 关闭 关闭 点击数: 1949 1.Petapoco基本用法 1.1.创建示例工程 首先创建一个工程文件,为了便于展示数据这里创建一个类型为:WindowsApplication的工程文件。命名为:PetapocoTest。 程序最终布局及功能预览如下: 1.2.添加petapoco包 在项目文件的Reference上右键,选择“管理NuGet程序包”,并搜索Petapoco,安装之。 1.3.添加数据库连接 在app.config或web.config文件中添加数据库连接串。

下面是连接SQL Server: 下面是连接MySQL: 由于petapoco是与面向数据库无关的ORM组件,故对DB的增、删、改、查的代码与具体连接哪个物理数据库类型无关。 1.4.定义POCO-实体类 public class article { public long article_id { get; set; } public string title { get; set; } public DateTime date_created { get; set; } public bool draft { get; set; } public string content { get; set; } } 1.5.创建petapoco操作对象 接下来创建一个PetaPoco.Database对象。 var db=new PetaPoco.Database("DefaultConnection "); 1.6.查询数据 // 查询所有数据 foreach (var a in db.Query

("SELECT * FROM articles"))

python入门免费教程分享

python入门免费教程分享 通过Python入门爬虫比较简单易学,不需要在一开始掌握太多太基础太底层的知识就能很快上手,而且很快就能做出成果,非常适合小白一开始想做出点看得见的东西的成就感。你在学习Python?Python入门免费教程分享给你:python全新基础视频教程 https://https://www.wendangku.net/doc/1c19050469.html,/s/1i5kvG5f python课程教学高手晋级视频h ttps://https://www.wendangku.net/doc/1c19050469.html,/s/1htJW4KG python高级视频教程https://https://www.wendangku.net/doc/1c19050469.html,/s/1nvf3NOt 那么,你是否清楚Python工程师在企业里面的定位是什么?主要有四个重要的定位:验证算法、快速开发、测试运维、数据分析。 1、验证算法:就是对公司一些常见设计算法或者公式的验证,公式代码化。 2、快速开发:这个大家应该都比较熟悉,快速开发,就是用成熟框架,更少的代码来开发网站; 3、测试运维:做运维同学应该清楚,在Linux运维工作中日常操作涵盖了监控,部署,网络配置,日志分析,安全检测等等许许多多的方面,无所不包。python可以写很多的脚本,把“操作”这个行为做到极致。

与此同时,python在服务器管理工具上非常丰富,配置管理(saltstack) 批量执行( fabric, saltstack) 监控(Zenoss, nagios 插件) 虚拟化管理 ( python-libvirt) 进程管理(supervisor) 云计算(openstack) ...... 还有大部分系统C库都有python绑定。 4、数据分析:Python有三大神器:numpy,scipy,matplotlib,其中numpy很多底层使用C语言实现的,所以速度很快,用它参加各种数学建模大赛,完全可以替代r语言和MATLAB。spark,Hadoop都开了Python的接口,所以使用Python做大数据的mapreduce也非常简单,加上py对数据库支持都很好,或者类似sqlalchemy的orm也非常强大好用。 了解完Python工程师在企业里面的定位,大家或许还需要找一家培训中心进行学习。 1.权威资深师资阵容,Python业内极具责任心、懂教学、拥有超强技术、有大型项目经验实战派讲师授课,由业内知名专家及企业技术骨干组成; 2.自主研发QFTS教学系统,拥有自主知识产权的Python开发培训课程体

WIKI语法简介

WIKI语法简介 本文仅针对在Fitnesse页面编辑中涉及的WIKI语法进行简介。主要分为三部分:字符排版编辑,列表表格编辑以及链接编辑。 一、字符排版编辑 1.文本样式编辑 主要有:''斜体'' ,'''加粗''',''''加粗斜体'''',字体变大字体变小,等用法。具体效果见表格-1。 编辑输入实际输出注释 ''斜体'' 斜体这些用于改变字体, '''加粗''' 加粗前三个都是单引号, ''''加粗斜体'''' 加粗斜体不是双引号,尤其 !style_note[note] note四个单引号 !style_left[left]left显示在左边 !style_right[right]right显示在右边 表格-1 2.字符编辑 主要有:--删除线--,字符颜色,字符底纹,等用法。具体效果见表格-2。 编辑输入实际输出注释 --删除线-- 删除线 !style_red[red] red !style_error(an error) an error !style_code[code] code !style_code(!style_red[code red]) code red 也可以嵌套使用 表格-2 3. 标题排版编辑主要有:标题分为三级,排版时,输入过程中,另起一行在显示时表示为一个空格,空一行表示是另起一个段落。"====="表示是分割线"-------"。 具体效果见表格-3。 编辑输入实际输出注释 !1 标题1 标题1 !2 标题2 标题2 !3 标题3 标题3 ------------------------- -------------------- 分割线(但是会加粗) 表格-3

perl简单爬虫教程

本教程是一个简单的perl爬虫例子,使用正则表达式来抓取网页的内容(主要是为了练习练习正则,真的爬虫都不用正则而是使用DOM). 本教程的测试网站为(https://www.wendangku.net/doc/1c19050469.html,/weather/101020100.shtml)目的是抓取网站上如下表中的天气信息。 最后的结果为 使用到的工具(firefox浏览器,firebug插件,perl) 教程开始

1:观察网页结构 1.1 我们使用firebug发现我们想要抓取的表格的HTML代码结构为 1.2 我们看到我们要的表格放在3个class=”yuBaoTable”的

标签中,所以我们用一个正则将我们要的3段
存到一个一个数组中。(这里我们用perl来做)$start = '
我们又发现每天的白天和黑夜是放在两个标签里的 1.4 所以我们又用一个正则将两个中的代码存到一个数组 my @find_day = (/(.*?)<\/tr>/gs);

1.5 现在我们得到的就是我们需要抓取的最小单位了(每个白天/晚上的天气情况),接着用一堆正则将我们要的信息捕获出来即可 foreach my $re1(@find_day){ if($re1 =~ />(\d{1,2}日星期.*?)<\/a>/s){ print "$1\n"; } if($re1 =~ /(白天|夜间)/s){ printf "%8s:",$1; } if($re1 =~ /(晴|多云|阴|小雨|中雨|小到中雨|阵雨)/s){ printf "%5s ",$1; } #30 if($re1 =~ /(高温|低温).*?\(.*?)<\/strong>/s){ printf "%8s:%5s",$1,$2 ; } if($re1 =~ /(西北风|北风|东北方|东风|东南风|南风|西南风|西风)/s){ printf "%8s:",$1; } if($re1 =~ />.*?(\d-\d级).*?<\/a>/s){ printf "%6s\n",$1; } } 抓取结束。。。 贴上完整代码(perl版)

shtml入门教程(超详细)

超级详细shtml教程 SSI有什么用? 之所以要扯到ssi,是因为shtml--server-parsed HTML 的首字母缩略词。包含有嵌入式服务器方包含命令的HTML 文本。在被传送给浏览器之前,服务器会对SHTML 文档进行完全地读取、分析以及修改。 shtml和asp 有一些相似,以shtml命名的文件里,使用了ssi的一些指令,就像asp中的指令,你可以在SHTML文件中写入SSI指令,当客户端访问这些shtml文件时,服务器端会把这些SHTML文件进行读取和解释,把SHTML文件中包含的SSI指令解释出来 比如:你可以在SHTML文件中用SSI指令引用其他的html文件(#include ),服务器传送给客户端的文件,是已经解释的SHTML不会有SSI指令。它实现了HTML所没有的功能,就是可以实现了动态的SHTML,可以说是HTML的一种进化吧。像新浪的新闻系统就是这样的,新闻内容是固定的但它上面的广告和菜单等就是用#include引用进来的。 目前,主要有以下几种用用途: 1、显示服务器端环境变量<#echo> 2、将文本内容直接插入到文档中<#include> 3、显示WEB文档相关信息<#flastmod #fsize> (如文件制作日期/大小等) 4、直接执行服务器上的各种程序<#exec>(如CGI或其他可执行程序) 5、设置SSI信息显示格式<#config>(如文件制作日期/大小显示方式) 高级SSI可设置变量使用if条件语句。 使用SSI SSI是为WEB服务器提供的一套命令,这些命令只要直接嵌入到HTML文档的注释内容之中即可。如:

24 动词语法简介

法语动词语法简介 A verb may be defined as the 'action word of the sentence'. To determine whether a word is a verb or not, consider its role in the sentence. How is the word 'access' used in the following sentences? Never give strangers access to your bank account. If you can't access the Web pages during peak hours, try again. In the first sentence, 'access' is a thing (a noun) that you can give to somebody. In the second sentence, 'access' is something you do (a verb) with your computer. The point is that whether a word is considered a noun or a verb depends on how it is used in the sentence. 1. infinitives and conjugations (不定式与变化式) When you study verbs, you will need to know the difference between the infinitive form of the verb and the finite forms, or conjugated forms. English infinitives are preceded by the word 'to'. to eat, to drink, to sleep These verbs are called infinitives because, like the concept of infinity, they are not bound by time. From the infinitive, we derive the conjugated forms of the verb, also known as the finite forms of the verb. They are called finite because they refer to events anchored in time, that is, to events that have a particular tense: past, present, future. Note the conjugated forms of the infinitive 'to study'. I studied French in high school. past tense conjugation(过去变化式) I am studying French in college this semester. present tense conjugation (现在变化式) I will study French next year overseas. future tense conjugation (将来变化式) Verb conjugations are traditionally presented in textbooks according to paradigms, a grammatical term for pattern. A paradigm always includes the infinitive followed by the conjugations according to person which is divided into first, second and third, as well as number, which is the distinction between singular and plural.

-Python基础教程(自学记录)

第一章快速改造:基础知识 1.2交互式解释器 在IDLE编辑器,在提示符后输入help然后按回车;也可以按下F1获得有关IDLE的帮助信息 1.4数字和表达式 1/2返回0,整除除法;1.0/2返回0.5,用一个或者多个包含小数点的数字参与计算。另外改变除法的执行方式:from_future_import division //可以实现整除,1.0//2.0返回0.0 %取余数;**幂运算; >>> 1/2

>>> 1.0/2 0.5 >>> 1.0//2.0 0.0 >>> 10%3 1 >>> 9**(1/2) 1 >>> 9**(1.0/2) 3.0 >>> 2.75%0.5 0.25 >>> -9%4 3 >>> -3%2 1 >>> -3/2 -2 1.4.1长整数 普通整数不能大于2147483647也不能小于-2147483648,若更大的数,可以使用长整数。长整数结尾有个L,理论上小写也可以,不过为了便于识别,尽可能用大写。

1.4.2十六进制和八进制 0XAF返回175 ,十六进制; 010返回8,八进制 >>> 0xAF 175 >>> 010 8 1.5变量 包含字母、数字和下划线。首字母不能是数字开头。 1.8函数 Pow计算乘方:pow(2,3),2**3均返回8;pow等标准函数称为内建函数。 Abs(-10)求绝对值,返回10;round(1.0/2.0)返回1.0,把浮点数四舍五入为最接近的整数值。 >>> pow(2,3) 8 >>> 2**3 8 >>> abs(-10) 10 >>> round(1.0/2.0) 1.0

语法简介

语文语法知识 1、词类:有实词与虚词两大类 (1)实词:表示实在的意义,能够作短语或句子的成分能够独立成句 虚词:一般不表示实在的意义,不作短语或句子的成分(只有副词例外),它们的基本用途是表示语法关系 A、名词:表示人和事物名称的词 表示人的名称, 如同志、作家、父亲、主人、老李; 表示具体事物,河流、高山、森林湖泊; 表示抽象事物,如政治、科学效率、品德、; 表示时间名称,上午、夏天、春天、现在、立春、星期二、刚才; 表示处所名称:上海、中国、颐和园、商店、亚洲、北京; 表示方位名称:上、下、东、西、里、前、内(简称方位词)名词的语法特点 :①表示人称的名词,可以在后头加“们”表示多数 ②方位词常用在其他名词后头,组成表示处所、范围或时间的方位短语 ③名词一般不受副词修饰 B、动词:是表示动作行为、发展变化、心理活动等意义的词1、动作动词:表动作、行为如,走看说进行开始 2、心理活动动词如,想爱恨怕希望喜欢担心 3、使令动词:表指使、命令或请求如,使叫让派请求禁止 4、能愿动词(助动词)如,能会可以愿肯敢要应应该(跟动词、形容词等组成能愿短语如,能够解决) 5、趋向动词如,来去上进出回过开上来起来 6、判断动词:主要是“是”,以及同“是”相当的“为”等 动词的语法特点: ①动词一般受副词“不”的修饰 ②动词后面可以带“着、了、过”,表示动态 ③一部分动词可以重叠,表示时间短暂或尝试的意思 ④判断词“是”主要是联结句子的主语和宾语 ⑤能愿动词后面不能跟名词,能愿动词可以和后面的动词一起作谓语中心语,也可以单独作谓语中心语 ⑥趋向动词可以单独作谓语中心语,也可以在谓语中心语后面作补语 C、形容词:是表示事物的形状、性质、状态的词表示事物形状的:高、矮、胖、瘦弱; 表示事物性质的:红、甜、干净、清楚、漂亮、结实; 表示事物状态的:快、慢、雪白,滚烫,亮晶晶,泪涟涟;形容词的语法特点: ①一部分形容词可以用重叠形式来加强语义 ②大多数形容词可以受副词“很”修饰 D、数词:是表示数目的词表确数(表示分数,整数和倍数); 表概数:几、许多; 表序数:第一、老三;

perl 期末考试题

PERL复习题 一、选择题 B 1. What is the simplest type of data that Perl can work with? A element B scalar C vector D component 2. Which operator can be used to take the bottom item from an array? A pop B push C pull D plant 3. Which operator is used to arrange items in character order? A ascend B sort C arrange D descend 4. Rather than using print, what is often used in Perl when formatting is important? A printf B format C align D show 5. Which modifier can be used when matching in Perl to ignore case? A s B v C i D c 6. Which operator can be used to break up a string into more than one part based upon a separator? A chop B split C divide D parse 7. What option do you use when starting Perl to tell it to run in warning mode? __________ (Fill in the blank.) 8. Which control structure can be used to execute only a condition is false? A until B unless C while D without 9. Which of the following commands should be used to open a filehandle named KAREN to an existing file named sw? A open KAREN “>sw”; B open KAREN, “>sw”;

Catalyst入门教程

Catalyst入门教程(第1版) 前言 本教程是在CPAN上Catalyst的文档基础上编写的. 阅读本教程前你需要具备的知识: 1. 使用过perl编写cgi程序 2. 使用过perl的DBI编写perl程序进行数据库操作 编写者: 小生菜菜 联系邮箱: laomoi@https://www.wendangku.net/doc/1c19050469.html, 第 1 页

Catalyst入门教程(第1版) 目录 第 1 章CATALYST的简介 (3) 第1节搭建C A TAL YST开发环境 (3) 第2节创建第一个C A TAL YST项目 (4) 第 2 章剖析应用程序类 (8) 第 3 章掌握CONTROLLER (10) 第1节C ONTROLLER简介 (10) 第2节ACTION详解 (14) 第3节如何编写ACTION (23) 第 4 章掌握VIEW (29) 第1节简介 (29) 第2节TT入门 (32) 第3节把TT作为V IEW使用 (40) 第 5 章掌握MODEL (43) 第1节简介 (43) 第2节DBI X::C LASS::S CHEMA入门 (44) 第3节.把DBIC::S CHEMA作为M ODEL使用 (58) 第 6 章调试CATALYST程序 (62) 第 2 页

Catalyst入门教程(第1版) 第 1 章Catalyst的简介 使用perl进行web开发,传统的做法是写*.cgi文件,然后把这些cgi文件配到web server里面,当web server收到客户端的request时,就调用对应的cgi进行处理. 用这种方法进行web开发, cgi文件之间相对比较独立,代码里面可能含有大量的重复代码,整个系统的结构也是比较松散的, 可扩展性也不强. Catalyst是一套用来web开发的框架,基于Catalyst开发的web系统,具有比较强的可扩展性. 第1节搭建Catalyst开发环境 1 一般方法: 在linux系统上安装Catalyst只需要使用CPAN安装即可(推荐) cpan -i Catalyst cpan -i Catalyst::Devel(用来运行Catalyst项目的机器不需要安装该模块,如果需要使用Catalyst进行开发则需要安装该模块) 在windows上安装可以使用ppm,但是过程比较繁琐,不建议. 2 安装脚本 Matt Trout写了一个安装脚本: https://www.wendangku.net/doc/1c19050469.html,/static/cat-install 只需要从该链接下载脚本,然后 perl cat-install即可按顺序安装相关模块,可用于windows跟linux,如果用于windows的话,必须保证你的机器上有c编译器和make工具. 3 模块打包方法(推荐) Chris Laco把Catalyst相关的模块打成了一个包:https://www.wendangku.net/doc/1c19050469.html,/downloads/CatInABox.tar.gz 把该包下载下来不需要安装即可马上使用.可用于windows跟linux系统. 第 3 页

Perl语言入门实战习题

《Perl语言入门实战习题》 一、计算FASTA文件中每条序列的长度; 输入文件,FASTA格式: 注:如果输入文件在windows下产生,在Linux系统下操作时,宜先用dos2unix处理: 用法:dos2unix 输入文件 输出文件: Perl代码: #!/usr/bin/perl -w use strict; unless (@ARGV==2) { # @ARGV 传给脚本的命令行参数列表 die"Usage: perl $0 \n"; # 当命令行参数不是2的时候输出使用说明} my ($infile,$outfile) = @ARGV; # 把命令行参数赋值给输入文件和输出文件 open IN,$infile || die"error: can't open infile: $infile"; # 打开输入文件句柄IN open OUT,">$outfile" || die$!; # 打开输出文件句柄OUT $/=">";; # 设置输入记录分隔符为”>”,并去除第一个”>” while ( my $seq = ){ # 把序列ID行和序列赋值给$seq

my $id = $1 if($seq =~ /^(\S+)/); # 获取序列ID chomp $seq; # 去掉末尾的”>” $seq =~ s/^.+?\n//; # 删除第一行 $seq =~ s/\s//g; # 删除序列中的空白字符 my $len = length($seq); # 计算序列长度 print OUT "$id\t$len\n"; # 输出结果到输出文件 } $/="\n"; # 把输入记录分隔符改为默认值 close IN; # 关闭输入文件句柄 close OUT; # 关闭输出文件句柄 二、计算FASTA文件中每条序列的GC含量; 输入文件同上,输出文件: Perl代码: #!/usr/bin/perl -w use strict; unless (@ARGV==2) {# @ARGV 传给脚本的命令行参数列表 die"Usage: perl $0 \n";# 当命令行参数不是2的时候输出使用说明} my ($infile,$outfile) = @ARGV;# 把命令行参数赋值给输入文件和输出文件 open IN,$infile || die"error: can't open infile: $infile";# 打开输入文件句柄IN open OUT,">$outfile" || die$!;# 打开输出文件句柄OUT $/=">";;# 设置输入记录分隔符为”>”,并去除第一个”>” while (){# $_=,把序列ID行和序列赋值给$_,$_= 可以省略不写my $id = $1 if(/^(\S+)/);# 获取序列ID chomp; # 去掉末尾的”>” s/^.+?\n//;# 删除第一行 s/\s//g; # 删除序列中的空白字符 my $GC = (tr/GC/GC/);#计算G或C碱基个数 my $AT = (tr/AT/A T/);#计算A或T碱基个数 my $len = $GC + $AT;# 计算序列非N长度 my $gc_cont = $len ? $GC / $len : 0; #计算GC含量,如果长度为0,GC含量算0 print OUT "$id\t$gc_cont\n"; # 输出结果到输出文件 } $/="\n";# 把输入记录分隔符改为默认值 close IN; # 关闭输入文件句柄 close OUT;# 关闭输出文件句柄

Ruby语言入门教程

Ruby语言入门教程 Version0.6 编著张开川 kaichuan_zhang@https://www.wendangku.net/doc/1c19050469.html,

目录 自序 (3) 第一章概述 (4) 1.1编程语言的发展简史 (4) 1.2编程其实很容易 (5) 1.3Ruby的由来 (6) 1.4Ruby的特性 (7) 第二章 (8) 2.1下载Ruby1.8.5 (8) 2.2安装Ruby1.8.5for Windows (8) 2.3开始第一个小程序 (10) 2.4ruby语言的集成开发环境 (12) 第三章语法快览 (14) 3.1注释与分行 (14) 3.2分隔符 (15) 3.3关键字 (16) 3.4运算符 (17) 3.5标识名和变量的作用域 (19) 3.6类库 (19) 3.7数据类型 (20) 3.8赋值和条件运算符 (21) 3.9条件判断语句 (22) 3.10循环语句 (24) 3.11常与线程 (29) 3.12一个综合小练习 (30) 第四章一切都是对象 (31) 4.1两种思维方式 (31) 4.2对象 (32) 4.3封装 (33) 4.4继承 (34) 4.5多态36小跋37

自序 其它编程语言的学习都主要来自于书本,而Ruby的学习却是完全经由网络。我想,回报网络的最好方式就是在网络上还没有Ruby中文书籍的时候,编著一本Ruby中文入门教材。感谢编程语言发展史上的前辈们;感谢网络论坛上程序员们或是理智,或是激烈的讨论;感谢一切看到这本书的人。 曾经经受了SCJP的挖掘、挖掘、再挖掘(基于1.4,还没有Java5,Java6的许多特性),初遇Ruby,觉得十分亲切,仿佛童年时得到一个新奇的玩具。把玩之后,才发现玩具的塑料外壳里,藏着一把瑞士军刀。自此,模式、框架常常变得多余,很多时候可以更直接。好比在量子时代,星际航行只是一次时空转换而已,航天飞机静静地躺在博物馆里,那是旧时代科学的极致代表。 从物理课本中,我们感受到爱因斯坦的伟大,但对牛顿则怀以更加崇敬的心情。身体终将消逝,而你,我,他——我们的意识却将在网络中延续。旧时代文明的延续依赖于纸质书籍,书籍传递了理性之光。也许直觉才是这个宇宙本体的最初相用,直觉是一种天赋,我无从把握,但是理性,如此真切实在,她照亮了我,照亮了你,直到未来。 思,亘古如斯又倏忽闪现,谁的惊愕能深究它。 ——海德格尔 张开川 2006年12月31日

Perl语言入门(第四版)习题答案

《Perl语言入门习题答案》 练习 1、写一个程序,计算半径为的圆的周长。圆周长等于2π(π约为)乘以半径。答案为。-----------------------/home/confish/perl/girth #!/usr/bin/perl -w #this program calculate a circle's girth , $r=; $g=*2*; print "the girth of the circle is $g\n"; -----------------------/home/confish/perl/girth 2、修改上述程序,用户可以在程序运行时输入半径。如果,用户输入,则应得到和上题一样的结果。 -----------------------/home/confish/perl/girthpro #!/usr/bin/perl -w ` #a better one to calculate girth print"enter the radius of the circle\n"; chomp($r=); if($r>0) { print"the girth of the circle is ".$r*2*."\n"; ; } else { print"nonavailable!\n"; } -----------------------/home/confish/perl/girthpro 3、修改上述程序,当用户输入小于0 的数字时,程序输出的周长为0,而非负数。 】 -----------------------/home/confish/perl/girthzero #!/usr/bin/perl -w #calculate the girth and print 0 when the radius is lower than 0

CentOS+Zimbra详细配置教程

我的博客:https://www.wendangku.net/doc/1c19050469.html, 实验环境: 服务器系统:centos5 64位 IP:192.168.0.3 zimbra安装包:zxvf zcs-6.0.10_GA_2692.RHEL5_64.20101215170845.tgz 网络适配器的参数: [root@zcs ~]# ifconfig eth0 | grep 'inet addr'|awk '{print $2}'|cut -c 6- 192.168.0.3 /etc/sysconfig/network文件的主机名配置: HOSTNAME=https://www.wendangku.net/doc/1c19050469.html, /etc/hosts文件的配置: [root@zcs ~]# cat /etc/hosts 127.0.0.1 localhost.localdomain localhost ::1 localhost6.localdomain6 localhost6 192.168.0.3 https://www.wendangku.net/doc/1c19050469.html, zimbra /etc/resolv.conf文件的配置: [root@zcs ~]# cat /etc/resolv.conf nameserver 192.168.0.3 主机名称: [root@zcs ~]# hostname https://www.wendangku.net/doc/1c19050469.html, 配置dns服务: 编辑DNS解析配置文件: [root@zcs etc]# vi named.conf options { directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; }; logging { channel default_debug { file "data/named.run"; severity dynamic; }; }; zone "https://www.wendangku.net/doc/1c19050469.html," IN { type master; file "https://www.wendangku.net/doc/1c19050469.html,.zone"; allow-update {none;}; }; zone "0.168.192.in-addr.arpa" IN { type master; file "0.168.192.in-addr.arpa.zone";