左 括号;给的参数的列表操作符
左 ->
++ --
右 **
右 \ ! ~ + -(单目操作符)
左 =~ !~
左 * / % x
左 + - .
左 << >>
具名的单目操作符(-X文件测试; rand)
< <= > >= lt le gt ge(“不相等”操作符)
== != <=> eq ne cmp(“相等”操作符)
左 &
左 | ^
左 &&
左 ||
.. ...
右 ?:
右 = += -= .=(赋值操作符)
左 , =>
列表操作符(向右结合)
右 not
左 and
左 or xor
比较 | 数字 | 字符串 |
---|---|---|
相等 | == | eq |
不等 | != | ne |
小于 | < | lt |
大于 | > | gt |
小于等于 | <= | le |
大于等于 | >= | ge |
升序比较 | <=> | cmp |
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 ($count < 10){
}
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 ($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($fred, $barney);
也可以创建私有数组 my @phone_number;
use strict
告诉Perl内部编译器,接下来的代码应该稍加严谨一点,遵循一些优良的编程风格。
use 5.012
指定最低Perl版本号,版本号为三位数字。使用5.12版本将隐式打开strict约束指令。
return操作符 立即停止执行并从子程序返回某个值。
如果编译器在调用子程序前看到过子程序定义,或者Perl通过语法规则判断它只能是子程序调用,那么该子程序可以像内置函数一样,在调用时省略与号。
如果子程序和Perl内置函数同名,调用时必须使用与号。
持久性私有变量 state,可以用于任意类型变量。多次调用时,子程序持久性私有变量可以保持该值。
对数组和哈希,state类型变量有限制,不能在列表上下文中初始化这两种类型的state变量。
state $n = 0; #正确
state @array = qw ( a b c); #错误。