**要想走的快,就一个人走,要想到的远,就一起走。**
用perl -w my_program 让perl发出警告。
也可以在程序里面插入use warnings;
use diagnostics;信息比warnings更详细。
在把use diagnostics这个编译命令加进程序之后,你可能会觉得程序在启动的候或多或少有点慢。因为
你的程序正在忙着加载(到内存)警告和详细说明,换个角度看,如果你已了解各种警告信息,可以帮
助优化程序。也可以通过perl -Mdiagnostics ./my_program来实现。
标量变量:
标量变量存储的是标量值,标量的名称是以美元符号($)开头,后面可以跟上多个字母、数字或下划线。
但是开头不能是数字。另外,大写和小写的字母会被区分。$Fred和$fred是两个不同的变量。
大部分Perl程序员会建议你不要再写shell、awk和C程序了,但那往往不切实际。
标量变量只能存储一个值,但是像数组(array)和哈希(hash)之类的变量类型就可以存储多个值。
标量的赋值:
$fred = 17; #将$fred的值设为17
$barney = 'hello'; #将$barney的值高为5个字符组成的字符串'hello'
$barney = $fred + 3; #将$barney设为$fred当前值加上3后的结果,即20
$barney = $barney * 3; #$barney现在被设成$barney当前值乘以2后的结果,即40
最后一行中$barney变量出现了两次:第一次是取值(在等号右方的表达式中),第二次是赋值(在等号
左方),表示要将右方表达式的运算结果存到该变量中。
双目赋值操作符:
我们经常会用到类似$fred = $fred + 5这种形式(同样的变量出现在赋值操作符的两边)的表达式,于
是perl提供了更新变量内容的简写方式,也就是双目赋值操作符(binary assignment operator)。
$fred = $fred + 5; #不使用双目赋值操作符。
$fred += 5; #使用双目赋值操作符。
上面是等效的,下面也是等效的。
$barney = $barney * 3;
$barney *= 3;
以上的例子里,双目赋值操作符都是以某种方式直接修改变量的值,而非对表达式求值后覆盖原变量值
。
另一个常见的双目赋值操作符是由字符串连接操作符(.)改造的追加操作符(.=):
$str = $str . ""; #在$str末尾追加一个空格字符。
$str .= "";
#用追加操作符做同样的事。
几乎所有的双目操作符都可以这么用,如乘幂操作符也能改成**=,所以$fred **= 3;和
$fred = $fred ** 3是一样的。也就是取$fred的三次方。再存回$fred.
字符串中的标量变量内插:
双引号圈引的字符串直接能进行变量内插,这就是说,字符串内的所有标量名,都会被替换为该变量当
前的值。
$meal = "brontosaurus steak";
$barney = "fred ate a $meal"; # $barney 现在是" fred ate a brontosaurus steak"
$barney = 'fred ate a ' . $meal; # $另一种等效写法
如果变量从来没有被赋值过,就会用空字符串来代替。
如果要打印变量:
print "$fred"; #双引号是多余的
print $fred; #这样比较好
这种写法会让该值被当成字符串处理,而不是当成数字处理,在某些罕见的状况下,也许需要这种写法
,但是在平时,这几乎是在浪费打字时间。
变量内插也称为双引号内插,因为它只会在双引号(而非单引号)里起作用。
如果要将"$"本身放进双引号内的字符串,可以在前面用反斜线转义,以避开它的特殊意义。
$fred = 'hello';
print "The name is \$fred.\n"; #会输出$符号
print 'The name is $fred'."\n"; #这样也行
进行内插时,Perl会尽可能使用最长且合法的变量名称,要是你想在内插的值后面,紧接着输出字母、
数字或下划线,可能会碰上麻烦,当Perl检查变量名称时,它会违背你的本意,将后面的字符当作变量
名称一部分,用一对花括号将变量围起来,也可以先把字符串拆成两半,再利用连接符接起来。
$what = "brontosaurus steak";
$n = 3;
print "fred ate $n $whats.\n"; #不是steaks,而是$whats的值,也这是空值。
print "fred ate $n ${what}s.\n"; #现在是用$what了。
print "fred ate $n $what"."s.\n"; #另一种写法,比较麻烦。
print 'fred ate '. $n . '' . $what. "s.\n"; #写起来特别麻烦。
操作符的优先与结合性:
所有同时在Perl和C里出现的操作符,它们的优先级和结合性都是相同的。
操作符的结合性与优先级(从高到低排序)
结合性 操作符
左 括号;给定参数的列表操作符
左 ->
++ -- (自增;自减)
右 **
右 \ ! ~ + - (单目操作符)
左 =~ !~
左 * / % x
左 + - . (双目操作符)
左 << >>
具名的单目操作符(-X 文件测试;rand)
< <= > >= lt le gt ge (不相等操作符)
== != <=> eq ne cmp (“相等”操作符)
左 &
左 | ^
左 &&
左 ||
.. ...
右 ?:(三目操作符)
右 = += -= .= (以及类似的赋值操作符)
左 , =>
列表操作符(向右结合)
右 not
左 and
左 or xor
右:表示从右到左,右边的优先级高于左边。
左:表示从左到右,左边的优先级高于右边。
4**3**2 ##4**(3**2),得4**9(这就是向右结合)
72/12/3 ##(72/12)/3,得6/2,得2(这就是向左结合)
比较操作符:
比较 数值 字符串
相等 == eq
不等 != ne
小于 < lt
大于 > gt
小于或等于 <= le
大于或等于 >= ge
35 != 30 + 5 #false
35 == 35.0 #true
'35' eq '35.0' #false
'fred' lt 'barney' #false
'fred' lt 'free' #true
'fred' eq "fred" #true
'fred' eq 'Fred' #false
' ' gt '' #true
#!/usr/bin/perl -w
$name = "fred";
if ($name eq 'fred')
{
printf "true\n";
}
else
{
printf "false\n";
}
布尔值:
任何标量值都可以成为if控制结构里的判断条件。如果你将真或假值放进某个变量里,使用起来会很方
便:
$is_bigger = $name gt 'fred';
if ($is_bigger)
{
...
}
怎么决定某个值的真假呢?和其它语言不同,Perl并没用专用的“布尔”(Boolean)数据类型,它是靠一些
简单的规则来判断的:
*如果值为数字,0为假;所有其他数字都为真。
*如果值为字符串,空字符串('')为假;所有其他字符串都为真。
*如果不是数字也不是字符串,就先转换成数字或字符串再行判断。
以上规则中隐藏了另一条规则,字符串'O'跟数字0是同一个标量值,所以Perl会将他们一视同仁。也就
是说,字符串'O'是唯一被当成假的非空字符串。
获取用户输入:
最简单就是“行输入”操作符
$line = ;
if ($line eq "\n") {
print "That was just a blank line!\n";
}else{
print "That line of input was: $line";
}
#!/usr/bin/perl -w
$is_bigger = ;
if ($is_bigger >= 5){
print "That is bigger\n";
} else {
print "That is smaller\n";
}
chomp操作符:
$text = "a line of text\n"; #假设是从读进来的
chomp($text); #去除行末的换行符
chomp最常用的方法:
chomp($text = ); #读入文字,略过最后的换行符
$text = ;
chomp($text); #和上面一样,分成两步来做
$food = ;
$betty = chomp $food; #会得到返回值1,不过我们早就知道了!
11:36 2010-8-14
阅读(874) | 评论(0) | 转发(0) |