色破飞机 发表于 2015-12-26 11:55:30

Perl语言学习笔记(二) 标量数据

  
第二章 标量数据
  
  标量(Scalar):单件事物,数字或字符组成的串
  
  所有数字的内部格式都相同:总是按照“双精度浮点数”的要求来保存并进行运算。即,Perl中不存在整数值。
  
  浮点数直接量 :没什么好说的
  
  整数直接量:可以用下划线将若干位数分开,如61298040283768可以写成61_298_040_283_768
  
  非十进制度整数直接量:0377八进制,0xFF十六进制,0b11111111二进制。0x1377_0B77。前置零的表示法只对直接量有效,但不能在字符串自动转换成数字时使用。
  
  数字操作符:取模操作符%先取整后再求余,10.5% 3.2 和 10 % 3的计算结果相同。取模对负数的处理不同版本不一样。乘幂操作符以双星号表示,2 ** 3 = 8。
  
  字符串:字符串能够包含任何字符,所以可用它来对二进制数据进行创建、扫描于操作,读入一个图形文件或可执行文件到Perl的字符串变量里,改变它的内容,再写回去。有两种字符串直接量。
  
  单引号内的字符串直接量:单引号内所有字符都代表它们自己(包括换行符)。要表示反斜线和单引号本身,需要在前面加一个反斜线。
  'hello\n'# hello 后面接着反斜线和n
  'hello
  there'# hello、换行符、there(总共11个字符)
  '\'\\'# 单引号,紧接着反斜线
  要注意的是,单引号内的\n并不代表换行字符,而是表示反斜线和n这两个字符。只有在后面是另一个反斜线或单引号时,前面的反斜线才有特殊的意义。
  
  双引号内的字符串直接量:跟其他语言里的字符串没什么两样,不过变量内插是个什么东西?
  
  字符串操作符:
  用“.”操作符连接字符串(必须显式使用): 'hello wrold' . "\n" # 等同于"hello world\n"
  字符串重复操作符(小写字母x): "fred" x 3# "fredfredfred"
      5 x 4 # "5555" 5先被转换成单字符的串"5"
     右操作数在使用前会先取整,复制次数小于1时,会生成长度为零度空字符串
  
  数字与字符串之间的自动转换:
  自动转换取决于操作符需要什么类型的操作数。字符串转换成数字时会转换成等效的十进制浮点数。前置零的技巧只对直接量有效,不能用在字符串的自动转换上。用hex()或oct()来转换字符串。"12" * "3" 结果是36,字符串中非数字的部分以及前置度空白符号会被略过。"12fred34" * "3"结果也是36。完全不含数字的字符串被转换成零。"Z" . 5 * 7   # 等同于"Z35"。
  
  Perl内建警告信息:
  运行程序时使用-w选项启用警告功能:$ perl -w my_program
  使用#!指名每次运行都启用警告功能:#!/usr/bin/perl -w
  在Perl 5.6及更高版本,启用warnings编译命令打开警告功能:
      #!/usr/bin/perl
       use warnings;
  启用diagnostics编译命令查看更详细的问题描述:
      #!/usr/bin/perl
       use diagnostics;
  启用diagnostics编译命令后,程序启动时会加载警告和详细说明到内存中,影响程序速度。所以可通过命令行选项-M仅在需要时再加载diagnostics编译命令:$ perl -Mdiagnostics ./my_program
  
  标量变量: 以美元符号($)开头,后跟Perl标识符,区分大小写。
  
  慎选变量名称: :-)
  
  标量的赋值: 就用等号吧
  
  双目赋值操作符: o(∩∩)o...哈哈
  
  用print输出结果: 可以用print输出一系列用逗号隔开的值。
  print "The answer is ", 6 * 7, ".\n";
  这实际上是一个列表(list),列表是什么?
  
  字符串中的标量变量内插:
  双引号圈内的字符串直接量能进行变量内插。就是说,字符串内的所有标量变量名,都会被替换为该变量的当前值。
  $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检查变量名称时,它会违背你的本意,将后面的字符当作变量名称的一部分。解决办法很简单,和shell脚本一样,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";     # 写起来特别麻烦
  另外还有一些可能会出问题的字符。在标量变量名称的后面,如果需要接上左方括号(是不是还有另一个符号?书上貌似有印刷错误),请在括号前面加上反斜线。要是变量名称后面的接的是单引号或两个冒号,也需要用同样的方式处理。也可以用上述方法中提到的花括号表示法来代替。
  
  操作符的优先级与结合性:
  4 ** 3 ** 2# 4 ** (3 ** 2),得4 ** 9 (向右结合)
  72 / 12 /3 # (72 / 12) / 3,得6/3,得2 (向左结合)
  因为**是向右结合的,所以隐含的括号便放在右边。而/是向左结合的,因此隐含的括号便放在左边。
  
  比较操作符:
    ==, !=, <,>, <=, >=
  eq ne lt gt le ge
  35 != 30 + 5# 假
  '35' eq '35.0'  # 假 (当成字符串来比较)
  ' ' gt ' '# 真
  'fred' lt 'free'      # 真
  
  if控制结构:
  if ($name gt 'fred') {
  print "'$name' comes after 'fred' in sorted order.\n";
  } else {
  print "'$name' does not come after 'fred'.\n";
  }
  可选的程序块周围一定要加上表示块界限的花括号。
  
  布尔值:
  任何标量值都可以成为if控制结构里的判断条件。
  Perl没有专用的布尔值。
  数字0为假,其他数字为真。
  空字符串('')为假,其他字符串为真。
  如果不是数字也不是字符串,先转换成数字或字符串再进行判断。
  字符串'0'跟数字是同一个标量,字符串'0'是唯一被当成假的非空字符串。
  
  获取用户输入:
  只要在程序代码中能使用标量值的位置写上行数入操作符<STDIN>,Perl就会从标准输入读进一行文字,直到换行符为止。<STDIN>返回的字符串,一般在最后都会跟有一个换行符。
  
  chomp操作符:
  作用于一个内容为字符串的变量上,移除此字符串结尾的一个换行符(如果有,不论有几个)。
  在Perl程序里,任何需要变量的地方都可以用赋值运算来替代。首先,Perl执行赋值操作,然后按你想要的任意一种方式使用变量。chomp常见用法:chomp($text = <STDIN>);#读入文字,略过最后的换行符。
  chomp返回值是实际移除的字符数。
  使用chomp时可以不加括号,这是Perl的一项惯例:除非去掉括号会改变表达式的意义,否则括号用不用都可以。
  
  while控制结构:
  $count = 0;
  while ($count < 10) {
  $count += 2;
  }
  花括号必不可少!
  
  undef值:
  标量变量在首次被赋值之前,其初始值就是undef。undef作为数字,它会假设这是0,如果是字符串,它会假设这是空字符串。但是undef不是数字也不是字符串,它是另一种类型的标量值。
  
  defined函数:
  使用defined判读某个字符串是undef而不是空字符串。如果是undef,该函数返回假,否则返回真。defined($madonna)
  如果想自己创建undef值,可以直接使用同名的undef操作符:
  $madonna = undef;
  
  
  There is more than one way to do it!
  
  
  
  
  
  
  
  
  
  
  
页: [1]
查看完整版本: Perl语言学习笔记(二) 标量数据