Sky对《Perl语言入门 第六版(中文版)》的笔记(94)

Sky
Sky (好好读书,认真笔记!)

读过 Perl语言入门 第六版(中文版)

Perl语言入门 第六版(中文版)
  • 书名: Perl语言入门 第六版(中文版)
  • 作者: Randal L.Schwartz/brian d foy/Tom Phoenix
  • 页数: 363
  • 出版社: 东南大学出版社
  • 出版年: 2012-3
  • 第30页 标量数据

    Perl里面有个非常重要的概念——标量(scalar)。他是Perl中单个事物的单位。 对于大部分标量来说,他要么是数字,要么是字符串(在其他编程语言中,hello是5个字符的集合,而不是单个事物,但在Perl中,她就是一个独立的标量值)。 对于Perl中的数字标量,在Perl内部,是没有整型这一说的,所有的整数和浮点数,都是按照“双精度浮点数”的要求来保存和运算的。

    2012-11-11 17:24:03 回应
  • 第32页 整数直接量

    或者我个人认为,直接量(literal)这个东西翻译成字面量可能更自然一些。 Perl允许在整数直接量中插入下划线作为分割(注意:在浮点数直接量中,没有提到过这种用法),这样可以是整数本身的可读性更好一点。用书中举到的例子就是:61298040283768可以被写成这个样子 61_298_040_283_768。

    非十进制的整数直接量
    引自 整数直接量

    非十进制的表示法,基本上是以“前置零”(leading zero)作为标识的。最常见八进制和十六进制的表示法和Java语言是一样的:分别以0和0x作为数字的前缀。但是Perl本身还支持二进制的数字表示法(以0b开头,这里b就是binary了缩写了),这点是Java不支持的。 这里不要忘记,非十进制整数也是整数,所以也支持上面的那个以下划线分割数字的形式。

    数字操作符
    引自 整数直接量

    普通的加减乘除和取模和其他编程语言没有差别,这里不强调了。值得注意的有如下两点:1、关于非整数取模运算,会将非整数转换成整数之后,再进行取模运算。比如:10.5%3.2和10%3的结果是一样的;2、可以使用双星号(**)表示乘幂操作符,比如:2**3=8,表示的就是求2的3次方的大小。

    2012-11-11 17:51:59 回应
  • 第33页 字符串

    Perl的字符串可以包含任何字符,所以他有点比较牛逼的功能是,居然可以操控二进制数据。比如,你可以将一个图形文件或者编译过的可执行文件读进Perl的字符串变量,修改他的内容之后,再写回去。 Perl虽然完全支持Unicode,但是由于历史原因,他不会将程序源代码当作Unicode的文本文件读入。所以如果你需要在源代码中使用Unicode书写直接量的话,得手工加上utf8编译指令:

    use utf8;

    关于字符串的单引号和双引号表示的区别,跟shell很像,基本原则也是:单引号里是啥就是啥(当然特殊字符还是可以通过加入\进行转义表示的)。双引号里面就包括变量替换和各种转义字符的运用了(关于Perl的转义字符,35页有个简单的列表,可以参考)。

    2012-11-11 18:17:36 回应
  • 第36页 字符串操作符

    两个操作符很有意思: 1、连接操作符:和Java里面的+功能类似,但是在Perl中用“.”。 2、重复操作符:这个比较特殊,用x表示,没有在其他编程语言中看到过。直接看书里的例子吧:

    "fred" x 3    #"fredfredfred"
    "barney" x (4+1)    #就是"barney" x 5,所以结果就是:"barneybarneybarneybarneybarney"
    5 x 4.8    # 本质上是"5" x 4,所以最终结果是:"5555"

    最后一个例子有点意思,怎么推出的上面的注释里面说的“本质上”的结论呢? 因为x是字符串的操作符,所以这里5会被当作"5"而不是数字5,然后x右侧需要整数,于是4.8被转换成了4,于是就有了上面的注释里面解释的形式了。 这里需要注意的是:重复数字(x右侧的数字)小于1时,会生成长度为0的空字符串。

    数字与字符串之间的自动转换
    引自 字符串操作符

    基本原则就是根据操作符,推断出scalar是数字还是字符串。比如:"."是字符串操作符;还有上面例子的5 x 4.8;而"+"是数字的加法,所以两边应该是数字。书里面关于字符串自动转换成数字的例子可以留意一下:

    "12" * "3"    # 36
    "12fred34" * " 3"    # 36,这种转换不会给出警告信息。
    2012-11-11 18:39:33 回应
  • 第37页 Perl的内置警告信息

    可以通过如下方式开启(警告只是给程序员输出提示信息,不会影响程序的正常执行路径):

    #!/usr/bin/perl
    use warnings;

    or

    perl -w my_program

    or

    #!/usr/bin/perl-w

    上面只是给出简单警告信息,但是如果你需要详细错误提示的话,可以加入diagnostics模块,加入的方式也主要有如下两种:

    #!/usr/bin/perl
    use diagnostics;

    or

    perl -Mdiagnostics my_program

    这里,如果加载如上诊断模块会使程序启动变慢,因为需要预加载该模块进内存。

    2012-11-11 18:53:53 回应
  • 第40页 标量的赋值

    其实熟悉shell的人,看到Perl的标量变量的概念是不会陌生的。但是关于标量的赋值却要小心了,就是在Perl中,标量被赋值时,依然需要$符号作为前缀对标量进行引用的(而且等号左右两边是可以有空格的),shell中是不需要$的,直接看例子吧:

    $fred = 17;
    $barney = 'hello';     # 'hello'
    $barney = $fred + 3;    # 20
    $barney = $barney * 2;    #40
    双目赋值操作符
    引自 标量的赋值

    这个没有带多的特殊性,和Java、C的语法非常类似,直接看例子,下面的两个写法是等效的:

    $fred = $fred + 5;
    $fred += 5;

    这里,甚至字符串的连接操作符也可以修改成这样的形式:

    $str = $str. " "; 
    $str .= " ";
    2012-11-11 19:26:53 回应
  • 第43页 借助代码点创建字符

    基本需求是有些字符在键盘上根本找不到对应的键位,也就意味着你没法输入。 Perl中,一种可行的方案是先找到这些特殊符号对应的Unicode的code point,然后借助chr()函数(入参是16进制数字)转换成对应的字符:

    $alef = chr( 0x05D0 );
    $alpha = chr( hex('03B1') );
    $omega = chr( 0x03C9 );

    如果并不需要变量存储由code point转换得到的字符,而是直接使用的话,到时还有如下这种快捷方式(直接通过\x{}):

    "\x{03B1}\x{03C9}";

    反过来,我们可以通过ord()函数把一个字符转换成一个code point,如下:

    $code_point = ord( '? ' );
    2012-11-11 21:33:06 回应
  • 第46页 比较操作符

    Perl的比较操作符和shell的比较操作符有点类似,都是对于数字和字符串提供两套符号,不过使用的场景刚好反过来了(而且perl中不需要中划线-作为字母缩写形式的前缀了,比如-lt),Perl的使用场景是下面这样的: 1、数字比较符:

    == 
    != 
    <
    >
    <=
    >=

    2、字符串比较符:

    eq
    ne
    lt
    gt
    le
    ge
    布尔值
    引自 比较操作符

    Perl里面的默认布尔值跟shell也不同。Perl有如下规定: 1、对于数字,0为假,其他都为真。 2、如果是字符串,空字符串('')为假,其他所有字符串都为真。(但'0'是个例外) 3、如果既不是数字也不是字符串,那就先转换成数字或者字符串之后再按照上述规则判断。

    2012-11-11 22:14:45 回应
  • 第48页 获取用户输入

    这个符号就有点怪异了,是:<STDIN>,直接看例子好了:

    $line = <STDIN>;
    if ($line eq "\n") {
        print "That was just a blank line!\n";
    }else {
        print "That line input was : $line";
    }
    chomp操作符
    引自 获取用户输入

    chomp()本质上是个函数,入参只能是字符串,作用就是去除字符串结尾的换行符,如果存在换行符的话。 这里需要注意的是,如果字符串结尾有多个换行符的时候,该函数只会去掉最后一个换行符。

    2012-11-11 22:22:29 回应
  • 第50页 undef值

    undef是除了数字、字符串之外的另一种标量。他被当作数字使用时相当于数字的0,当作字符串使用时相当于字符串的空串('')。

    defined函数
    引自 undef值

    判断一个字符串到底是空串还是undef的方法。前者返回true,后者则为false。

    2012-11-11 22:29:32 回应
<前页 1 2 3 4 5 6 7 8 9 10 后页>

Sky的其他笔记  · · · · · ·  ( 全部124条 )