perl学习之路2
这些主要是从 "小骆驼" 书上粘贴或者摘抄出来的, 个人认为需要记的语法知识
"在某些情况下, 你可能需要在一台机器上写程序, 再传送到另一台机器上运行.这时候, 请使用"文本模式(text mode)" 或者"ASCII模式(ASCIImode)". 记住, 千万不能是"二进制模式(binary mode)"即便是文本文件, 不同的系统对待换行符的方式也有所不同, 所以碰到无法理解的换行符,某些老旧的Perl还可能中断运行"
"一般来说, 程序可以以任何文件名保存.Perl程序并不需要用什么特殊的文件名或者扩展名命名,甚至能不用扩展名就最好保护用扩展名 "
"linux上应该修改文件属性使之变成可执行的 chmod a+x XXX(文件名)"
"有些函数需要写上版本号, 如下:
#!/usr/bin/perl
use 5.018 #这是我目前的版本 版本号后面必须是3位小数
say "Hello World"; #这时候say函数就能用了"
" # <-这个符号是注释符号, perl中没有块注释"
"在Unix系统里, 如果文本文件开头的最前面两个字符时#!, 那么最后跟着的就是用来执行这个文件的程序路径, 在windows上没用,在linux上需要说明。在windows上写了,也是可以的."
"Perl程序并不需要变量声明的部分"
"直接量是指某个数字在Perl源代码中的写法, 直接量并非运算结果, 也并不是I/O操作的结果,它只是直接键入程序源代码中的数据"
"在Perl内部,则总是按"双精度浮点数"的要求来保存数字并进行运算的,也就是说,Perl内部并不存在整数值---程序中用到的整形常亮会被转换成等效的浮点数值"
"perl允许用户在直接量中插入下划线"_" 如 61285158231521你可能读着很费劲 但是你可以这么写612_8515_8231_521 这两种写法都表示同一种数字 "
"Perl中同样可以使用八进制、十六进制来表示整型常量,除了八、十六进制外,还有二进制,八进制的常量使用0(零)开头,十六进制以0x开头,二进制以0b开头,例如:
- 0377
- 0xFF
- 0b11111111
"
"2**3表示2的3次方 = 8, 取模操作符先取整然后再求余,所以10.5%3.2和10%3的计算结果是一样的"
"字符串就是一个字符序列, 最短的字符串不包括任何字符串是个空串, 最长的字符串没有任何限制, 可以填满整个内存"
"和c or c++不同, 空字符NULL在Perl里并没有什么特殊的意义, Perl会另行记住字符串的长度, 而不是用空字符串来表示字符串的结尾"
"Perl完全支持Unicode,但是它不会自动将程序源代码当做Unicode编码的文本文件读入, 所以如果你想要在源代码中使用Unicode书写直接量的话, 得手工加上utf8编译指令 use utf8 (这是个好习惯)"
"单引号内的字符串直接量指的是一对单引号圈引的一串字符, 前后两个单引号并不属于字符串的内容, 它们只是用来让Perl识别字符串的开头与结尾, 除了单引号和反斜线字符外, 单引号内所有字符都代表他们自己, 要表示反斜线字符本身, 需要在这个反斜线字符前再加一个反斜线字符表示转义, 表示单引号本身也要转义, 如下
'hello\n' #这里不表示换行 表示hello后面接着反斜线和字母n
'hello
there' #这里hello 换行符 there 总共11个字符 (换行了)
'\'\\' #单引号紧接着反斜线总共2个字符
"
"对于双引号字符串常量同单引号字符串常量唯一不同的是可以使用转义字符,例如前面的\n在双引号字符串常量中表示换行符。转义字符如下:
- \n 换行
- \r 回车
- \t 水平制表符
- \f 换页符
- \b 退格
- \a 响铃
- \e ESC
- \007 八进制的ASCII值,这里的007表示系统响铃
- \x7f 十六进制的ASCII值,这里的7f表示删除(DEL)键
- \cC 控制符,这里表示(Ctrl + C)
- \\ 反斜线
- \" 双引号
- \l 将下一个字符转换为小写
- \L 将到\E为止的所有字符转换为小写
- \u 将下个字符转换为大写
- \U 将到\E为止的所有字符转换为大写
- \Q 将到\E为止的非单词(non-word)字符加上反斜线
- \E \E、\U和\Q的结束符
"
"在Perl中可以用 . 来连接两个字符串 如 "hello" . ' ' . "World!" # 等同于"Hello World!" "
" 还有个特性就是字符串重复操作符,例如:"fred" x 3 # 得到"fredfredfred" ""在Perl中,Perl会根据需要在字符串和数字之间进行类型转换,转换的规则取决于操作符,如果操作符的对象是数字,那么Perl就会将它当作数字,如果操作符的对象是字符串时,则将它当作字符串,例如,"12" * "3"的结果为36,"12fred34" * "3"的结果也为36,Perl会忽略其中的非数字部分,特殊情况下不包含数字的字符串会被转换为零("fred"会被当作数字零来使用)。同样,在需要字符串的时候,数字会被转换为字符串来使用,"Z" . 5 * 7等同于"z" . 35得"Z35"。这些转换都是自动完成的,在平时编程注意一下就是了。"
"开启警告功能 use warnings, 也可以在命令行上使用-w选项对要运行的程序开启警告功能 perl -w xxx"
"如果看不懂某个警告信息, 可以利用diagnostics这个编译命令报告更为详尽的问题描述, 在perldiag文档中列有简要警告信息和详细诊断说明, 改文档是理解diagnosticd输出信息的最佳参考 use diagnostics"
"变量, 就是存储一个或者多个值得容器的名称, 而标量变量, 就是单单存储一个值得变量"
"标量变量存储的是单个标量值, 标量变量的名称以美元符号开头, 这个符号也称为魔符, 然后是变量的Perl标识符:由一个字母或者下划线开头, 区分大小写, 不限于ASCII字符为变量 如 $name $的意思是"取单个东西"或者"取标量" "
"Perl里面我们可以用一对花括号将变量名围起来以避免歧义, 如 print "fred ate $n ${what}s.\n" "
"数值与字符串的比较操作符
比较 数字 字符串
相等 == eq
不等 != ne
小于 < lt
大于 > gt
小于等于 <= le
大于等于 >= ge
"
"字符串'0'跟数字0是同一个标量值, 所以Perl会将他们一视同仁, 也就是说, 字符串'0'是唯一被当成假的非空字符串"
获取用户输入
只要把<STDIN>放在程序中希望返回标量值得位置上, Perl就会从标准输入读取一行文本.
由<STDIN>返回的字符串一般在末尾都会带有换行符, 所以通过下面这段代码, 我们可以看到实际发生的情况:
$line = <STDIN>;
if($line eq "\n")
{
print "that was just a blank line!\n";
}else
{print "that line of input was : $line";}
不过实际编写代码时, 很少需要保留末尾换行符, 所以人们常常会用chomp()操作符去掉它
chomp()最常见的用法就是连用: 如:
chomp($text = <STDIN>); #读入文字, 略过最后的换行符
$text = <STDIN>; #做上面语句同样的事
chomp($text); #却分成两步
chomp()本质是函数, 而作为一个函数, 它就有自己的返回值. chomp()函数的返回值是实际移除的字符串. 这个数字几乎没有用处, 如果字符串后面有两个以上的换行符, chomp()仅仅删除已个; 如果结尾处没有换行符, 它什么也不做, 直接返回零.
undef值
如果还没赋值就用到了某个标量变量, 不会发生什么大不了的事, 也绝对不会让程序终止运行. 在首次赋值前, 变量的初始值就是特殊的undef值, 它在Perl里的意思仅仅是: 这里空无一物, 如果你想把这个"空无一物"当成数字使用, 他就会表现的像零, 若果当成字符串使用, 他就会表现的像空字符串, 但undef既不是数字也不是zfc, 他完全是另一种类型的标量值
当读到文件结尾时, 他就会返回undef来表示这个状况
defined函数
要判断某个字符串是undef而不是空字符串, 可以使用defined函数, 如果是undef, 该函数返回假, 否则返回真:
$madonna = <STDIN>
if(defined($madonna) )
{
print "the input was $madonna";
}else
{
print "No input available!\n";
}
这里出现了一个问题:
代码如下:
1 #! /usr/bin/perl 2 3 chomp($madonne = <STDIN>); 4 if(defined($madonne) ) 5 { 6 print "中文$madonne\n"; 7 }else 8 { 9 print "NULL"; 10 }
代码很简单但是有个问题,在window环境下cmd是默认是gbk编码,所以悲催的事来了,假如说我输入的是中文字符串那么。。。
如图所示,出现乱码了。。于是 在代码中添加了一行 use utf8;于是 仍然显示乱码
在百度google以后。。。找到了这么一篇资料
http://blog.useasp.net/archive/2012/04/24/how_to_use_UTF8_encoding_in_Windows_CMD.aspx
结果 没!有!办!法!输!入!中!文! 程序里面的字符串倒是显示正常
现在真心不知道怎么办了。。。。
唉