Perl语言入门笔记:第二天
时间:2010-08-14 来源:linscora
**要想走的快,就一个人走,要想到的远,就一起走。**
用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'是唯一被当成假的非空字符串。 获取用户输入: 最简单就是“行输入”操作符<STDIN>
$line = <STDIN>;
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 = <STDIN>;
if ($is_bigger >= 5){
print "That is bigger\n";
} else {
print "That is smaller\n";
} chomp操作符: $text = "a line of text\n"; #假设是从<STDIN>读进来的
chomp($text); #去除行末的换行符 chomp最常用的方法:
chomp($text = <STDIN>); #读入文字,略过最后的换行符 $text = <STDIN>;
chomp($text); #和上面一样,分成两步来做 $food = <STDIN>;
$betty = chomp $food; #会得到返回值1,不过我们早就知道了!
11:36 2010-8-14
也可以在程序里面插入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'是唯一被当成假的非空字符串。 获取用户输入: 最简单就是“行输入”操作符<STDIN>
$line = <STDIN>;
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 = <STDIN>;
if ($is_bigger >= 5){
print "That is bigger\n";
} else {
print "That is smaller\n";
} chomp操作符: $text = "a line of text\n"; #假设是从<STDIN>读进来的
chomp($text); #去除行末的换行符 chomp最常用的方法:
chomp($text = <STDIN>); #读入文字,略过最后的换行符 $text = <STDIN>;
chomp($text); #和上面一样,分成两步来做 $food = <STDIN>;
$betty = chomp $food; #会得到返回值1,不过我们早就知道了!
11:36 2010-8-14
相关阅读 更多 +
排行榜 更多 +