Perl笔记:Perl语言入门(第六版) - 控制结构、子程序

来源:互联网 发布:openwrt 网络配置文件 编辑:程序博客网 时间:2024/04/27 13:38

操作符结合性与优先级

左   括号;给的参数的列表操作符

->

++ --

**

\  !  ~  +  -(单目操作符)

=~  !~

*  /  %  x

+  -  .

<<  >>

具名的单目操作符(-X文件测试; rand)

<  <=  >  >=  lt  le  gt  ge(“不相等”操作符)

==  !=  <=>  eq  ne  cmp(“相等”操作符)

&

|  ^

&&

||

..   ...

?:

=  +=  -=  .=(赋值操作符)

,  =>

列表操作符(向右结合)

not

and

or  xor

比较操作符

比较操作符比较数字字符串相等==eq不等!=ne小于<lt大于>gt小于等于<=le大于等于>=ge升序比较<=>cmp

控制结构

if unless elsif

if和unless的测试执行相反

if ( !defined $dino ) {

print "The value is undef.\n";

} elseif ($dino =~ /^-?\d+\.?$/) {

print "The value is an integer.\n";

} elseif ($dino eq '') {

print "The value is the empty string.\n"

} else {

print "The value is the string '$dino'.\n";

}

unless ($fred =~ /\A[A-Z_]\w*\z/i) {

print "The value of \$fred doesn't look like a Perl identifier name.\n";

}

while until

while和until的测试执行相反,前者为真时重复执行,后者为假时重复执行。

while ($count < 10){

}

foreach

foreach $rock (qw/ bedrock slate lava /){

}

表达式修饰符代码简写

print "$n is a negative number.\n" if $n < 0;

&error("Invalid input") unless &valid($input);

&greet($_) foreach @person;

print " ", ($n += 2) while $n < 10;

裸块

 {} 可以限制临时变量的作用域

for

for ($i = 1; $i <= 10; $i++){

}

在Perl解析器里,for和foreach关键字是等价的,有分号就是for循环,否则就是foreach循环。

for (1..10) {

}

循环控制

last 跳出最内层循环 对for foreach while until 裸块起作用。

next 立即开始下一次循环

redo 将控制返回到当前循环块的顶端,不经过任何条件测试,重新执行本次迭代。

带标签的块

LINE:while (<>){

last LINE if ();

}

last/next/redo后可以加上标签,可用于跳出多层循环。

条件操作符

?: 三目运算符

逻辑操作符和短路行为

逻辑操作符在通过左侧表达式能够确定总体的逻辑值时,不会再计算右侧的表达式,称为逻辑操作的短路行为。

Perl的逻辑操作符求取的值不是布尔,而是最后运算的表达式的值,可以用于赋值。my $last_name = $last_name{$someone} || '(No last name)';

定义或操作符 //

左边的值已定义时执行右边运算。

my $last_name = $last_name{$someone}  //  '(No last name)';判断是否定义和逻辑假不同。

逻辑操作符代替控制结构

通常不使用此写法,但有例外用法:open my $fh, '<', $filename or die "Can't open '$filename': $1";

子程序

基本用法

定义:sub marine {}

调用:&marine

所有的子程序都有返回值,但不一定有用。最后一次运算的结果会被自动当成子程序的返回值。

sub sum_of_fred_and_barney {

print "Hey, you called the sum_of_fred_and_barney subroutine!\n";

$fred + $barney; #这个不是返回值!

print "Hey, I'm returning a value now!\n";#糟糕!

}

返回最后执行的print的返回值,通常是1,表示成功输出信息。相加的结果被丢弃,但在启用警告时,会给出警告。

参数

子程序可以有参数,Perl会将参数列表化名为特殊的数组变量@_,该变量在子程序执行期间有效。

访问参数使用$_[0], $_[1];

调用子程序时,多余的参数会被忽略,参数不足时得到undef。

@_是子程序的私有变量,如果有全局的@_,则该全局变量会先被保存起来,并在子程序结束后恢复。

子程序也可以返回列表。

变长参数列表

在编写子程序时,应尽量支持变长参数列表。

$maxinum = &max(3, 10, 4, 7, 9);

sub max {

my ($max_so_far) = shift @_;

foreach (@_){

if ($_ > $max_so_far){

$max_so_far = $_;

}

}

$max_so_far;

}

在空参数列表调用时,返回undef。

my

子程序中可以使用my操作符创建私有变量,又叫词法变量

my 操作符不会改变上下文

声明多个词法变量时,需要加括号 my($fred, $barney);

也可以创建私有数组 my @phone_number;

编译指令

use strict

告诉Perl内部编译器,接下来的代码应该稍加严谨一点,遵循一些优良的编程风格。

use 5.012

指定最低Perl版本号,版本号为三位数字。使用5.12版本将隐式打开strict约束指令。

return

return操作符 立即停止执行并从子程序返回某个值。

省略&

如果编译器在调用子程序前看到过子程序定义,或者Perl通过语法规则判断它只能是子程序调用,那么该子程序可以像内置函数一样,在调用时省略与号。

如果子程序和Perl内置函数同名,调用时必须使用与号。

state

持久性私有变量 state,可以用于任意类型变量。多次调用时,子程序持久性私有变量可以保持该值。

对数组和哈希,state类型变量有限制,不能在列表上下文中初始化这两种类型的state变量。

state $n = 0; #正确

state @array = qw ( a b c); #错误。

0 0
原创粉丝点击