1.变量方式与php类似
2.perl 逻辑操作符
逻辑或:$a || $b 或 $a or $b
逻辑与:$a && $b 或 $a and $b
逻辑非:! $a 或 not $a
逻辑异或:$a xor $b
这个比较奇怪,即有类似c++,php的比较方式,又有类似fortran,basic的方式
3.数组
php $arr=array("one","two","three");
perl @array=("one","two","three");
下列语句访问数组@array的第三个元素:
$scalar = $array[2];
4.文件
php hd=fopen(fname,"rw");
perl open(FILE1,"file1");
perl读文件
$line = <MYFILE>;//读一行
@array = <MYFILE>;//读所有行
perl写文件
open (MESSAGE, "| mail dave");
print MESSAGE ("Hi, Dave! Your Perl program sent this!/n");
close (MESSAGE);
5.正则
php :
if(!empty($varname) && preg_match('/^/$[A-Za-z][_0-9a-zA-Z]*$/',$varname,$match)) return true;
perl:
if ($varname =~ /^/$[A-Za-z][_0-9a-zA-Z]*$/) {
print ("$varname is a legal scalar variable/n");
} elsif ($varname =~ /^@[A-Za-z][_0-9a-zA-Z]*$/) {
print ("$varname is a legal array variable/n");
} elsif ($varname =~ /^[A-Za-z][_0-9a-zA-Z]*$/) {
print ("$varname is a legal file variable/n");
} else {
print ("I don't understand what $varname is./n");
}
6.循环
类php的for循环 ,如
for ($count=1; $count <= 5; $count++) {
# statements inside the loop go here
}
7.foreach
php :
foreach($arr as $key=>$var) echo $var['name'];
perl:
@list = (1, 2, 3, 4, 5);
foreach $temp (@list) {
if ($temp == 2) {
$temp = 20;
}
}
8.这个设计比较奇怪
单行条件
语法为statement keyword condexpr。其中keyword可为if、unless、while或until,如:
print ("This is zero./n") if ($var == 0);
print ("This is zero./n") unless ($var != 0);
print ("Not zero yet./n") while ($var-- > 0);
print ("Not zero yet./n") until ($var-- == 0);
虽然条件判断写在后面,但却是先执行的。
9.子程序
php:
function mysub($str)
{
return $str;
}
perl:
sub subroutine{
statements;
}
用&调用
&subroutine;
前向引用 ,先定义子程序名,后面再定义子程序体
sub subname;
...
subname;
...
sub subname{
...
}
10.用别名传递数组参数
(1)、用前面讲到的调用方法&my_sub(@array)将把数组@array的数据拷贝到子程序中的变量@_中,当数组很大时,将会花费较多的资源和时间,而用别名传递将不做这些工作,而对该数组直接操作。形式如:
@myarray = (1, 2, 3, 4, 5);
&my_sub(*myarray);
sub my_sub {
my (*subarray) = @_;
}
(2)、此方法类似于C语言中的传递数组的起始地址指针,但并不一样,在定义数组的别名之后,如果有同名的简单变量,则对该变量也是起作用的。如:
$foo = 26;
@foo = ("here's", "a", "list");
&testsub (*foo);
...
sub testsub {
local (*printarray) = @_;
...
$printarray = 61;
}
11.
perl:
注:关联数组总是随机存贮的,因此当你用keys()访问其所有元素时,不保证元素以任何顺序出现,特别值得一提的是,它们不会以被创建的顺序出现。
要想控制关联数组元素出现的次序,可以用sort()函数对keys()返回值进行排列,如:
foreach $capword (sort keys(%wordlist)) {
print ("$capword: $wordlist{$capword}/n");
}
php:同理,php中
foreach( $arr as $key=>$var)
{}
//不保证元素以任何顺序出现,不会以录入次序出现。要想按顺序,则需要用asort arsort排序
12.
perl:
注:用列表给关联数组赋值时,Perl5允许使用"=>"或","来分隔下标与值,用"=>"可读性更好些,上面语句等效于:
%fruit = ("apples"=>17,"bananas"=>9,"oranges"=>"none");
php:
$arr = array("apples"=>17,"bananas"=>9,"oranges"=>"none");
13.
perl:
用关联数组循环
前面已经出现过利用keys()函数的foreach循环语句,这种循环效率比较低,因为每返回一个下标,还得再去寻找其值,如:
foreach $holder (keys(%records)){
$record = $records{$holder};
}
Perl提供一种更有效的循环方式,使用内嵌函数each(),如:
%records = ("Maris", 61, "Aaron", 755, "Young", 511);
while (($holder, $record) = each(%records)) {
# stuff goes here
}
each()函数每次返回一个双元素的列表,其第一个元素为下标,第二个元素为相应的值,最后返回一个空列表。
注意:千万不要在each()循环中添加或删除元素,否则会产生不可预料的后果。
$holder:下标 $record:相应的值
14.pringf 与php一样
perl:
printf("The number I want to print is %d./n", $number);
php:
printf("The number I want to print is %d./n", $number);
15.引用
perl:使用反斜线(/)操作符
反斜线操作符与C语言中传递地址的操作符&功能类似。一般是用/创建变量又一个新的引用。下面为创建简单变量的引用的例子:
#!/usr/bin/perl
$value = 10;
$pointer = /$value;
printf "/n Pointer Address $pointer of $value /n";
printf "/n What Pointer *($pointer) points to $$pointer/n";
结果输出如下:
Pointer Address SCALAR(0x806c520) of 10
What Pointer *(SCALAR(0x806c520)) points to 10
php:
$a="ABC";
$b =&$a;
echo $a;//这里输出:ABC
echo $b;//这里输出:ABC
16.
类
php :
class test
{
private $ddd;
function subf(){}
}
$t = new test();
perl:
首先,创建一个名为Cocoa.pm的包文件(扩展名pm是包的缺省扩展名,意为Perl Module)。一个模块就是一个包,一个包就是一个类。在做其它事之前,先加入“1;”这样一行,当你增加其它行时,记住保留“1;”为最后一行。这是Perl包的必需条件,否则该包就不会被Perl处理。下面是该文件的基本结构。
package Cocoa;
#
# Put "require" statements in for all required,imported packages
#
#
# Just add code here
#
sub new { #构造函数
my $this = {}; # Create an anonymous hash, and #self points to it.
bless $this; # Connect the hash to the package Cocoa.
return $this; # Return the reference to the hash.
}
1; # terminate the package with the required 1;
1 #!/usr/bin/perl
2 push (@INC,'pwd');
3 use Cocoa;
4 $cup = new Cocoa;
$cup = cocoa->new();
17. 在包间切换
perl:
$var = 14;
package mypack;
$var = 6;
第一个语句创建变量$var并存贮在main符号表中,第三个语句创建另一个同名变量$var并存贮在mypack包的符号表中。
在程序里可以随时在包间来回切换,如:
1: #!/usr/local/bin/perl
2:
3: package pack1;
4: $var = 26;
5: package pack2;
6: $var = 34;
7: package pack1;
8: print ("$var/n");
运行结果如下:
$ program
26
$
18.进程启动函数
perl:
函数名 eval
调用语法 eval(string)
解说 将string看作Perl语句执行。
正确执行后,系统变量$@为空串,如果有错误,$@中为错误信息。
例子 $print = "print (/"hello,world//n/");";
eval ($print);
结果输出 hello, world
与php一样
19.重点记忆
函数名 | fork |
调用语法 | procid = fork(); |
解说 | 创建程序的两个拷贝--父进程和子进程--同时运行。子进程返回零,父进程返回非零值,此值为子程序的进程ID号。 |
例子 | $retval = fork(); if ($retval == 0) { # this is the child process 执行子进程内容 exit; # this terminates the child process } else { # this is the parent process 执行父进程内容 } |
结果输出 | 无 |