Perl学习笔记(1)

最近要分析一个perl的程序 , 之前没有接触过这门脚本语言 , 现在刚好学习一下~

本章重点 : Perl 三个基本数据类型

Helloworld

与其他脚本语言类似 , perl 可以采用 交互式编程 , 也可以采用 脚本式编程

  • 交互式编程

    png

  • 脚本式编程

    png

    脚本中所有类型的空白( 比如 tab , 空格 , 空行 ... ) , 只要它们在引号外 , 那么解释器就会忽略它 , 如果它们在引号内 , 那么输出函数( 比如 print() )会原样输出空白


注释

  • 单行注释

    在每行之前添加字符 #

  • 多行注释

    perl中多行注释最常用的方法为 : POD( Plain Old Documentations )

    png

    =pod , =cut 只能放在行首
    POD语法以 " = " 作为开头 , 后面至少接一个字符 , 比如 " =pod "
    POD语法以 " =cut " 作为结尾 , 后面可以不跟其他字符


单引号和双引号

双引号可以正常解析一些转义字符或者变量 , 单引号则无法解析它们并原样输出

png

双引号中有单引号 , 双引号中有双引号 , 都需要添加 " \ " 进行转义

单引号中有双引号 , 双引号中有单引号 , 都不需要进行转义


Here Document

Here Document 是一种在命令行( sh , bash , csh , PowerShell ... ) 和 编程语言( Perl , Python , PHP , Ruby ) 中定义字符串的方法

png

 <<"EOF"; 作为 Here Document 的开头 , 后面必须接分号 " ; " , 否则编译不通过

 其中 EOF 外可以加单引号 , 双引号 或者不加引号 . 不加引号和使用双引号效果相同 , 会解析内嵌的变量或者转义字符 . 使用单引号则不解释内嵌的变量或者转义字符

 结尾处的EOF关键字必须在行首且独自为一行 , 不能衔接任何符号和字符

 EOF关键字可以换成任意字符 , 但要保证开始和结尾使用相同的字符

 在 Here Document 中需要内嵌引号时 , 不需要添加转义字符 " \ " , 因为 Here Docuement 本身对单双引号转义

Perl 标识符

在程序中使用的变量名 , 常量名 , 函数名 , 语句块名统称为 标识符

  • 标识符由 英文字符 , 数字 , 下划线( _ ) 组成
  • 标识符开头仅能为 英文字母 或者 下划线
  • 标识符区分大小写 , $a 和 $A 表示两个不同的变量

Perl 三个基本数据类型

  • 标量

    Perl中定义标量为 : $ + 标识符名 , 这种数据类型可以是数字 , 字符串 , 浮点数 ... 不做严格的区分

  • 数组( 或者叫列表 )

    Perl中定义数组为 : @ + 标识符名 , 索引从 0 开始

  • 哈希( 或者叫关联数组 )

    Perl中定义哈希为 : % + 标识符名 , Hash就是个无序的 key - value , 可以使用key作为下标去获取value


Perl 变量

变量是存储在内存中的数据 , 创建一个变量就会在内存上开辟一个空间 .

解释器会根据变量的类型来决定其在内存中的存储空间 , 因此可以为变量分配不同的数据类型( 标量 , 数组 , 哈希 , ... )

因此变量不需要显式声明类型 , 在变量赋值后 , 解释器会自动分配匹配的内存空间 . 如果需要强制声明类型 , 可以在程序中使用 use strict语句

Perl会为每个变量设置独立的命名空间 , 不同类型的变量可以使用相同的变量名 . 如下所示

png

  • 创建一个标量 : $a = 'aaa' , $b = 'bbb';
  • 创建一个数组 : @a = ('a','b','c','d');
  • 创建一个哈希 : %a = ('a' => 'aaa' , 'b' => 'bbb');
变量上下文

感觉这里是个重点 , 上下文是指表达式所在的位置

上下文是由等号左边的变量类型决定的 , 等号左边是标量 , 则是标量上下文 , 等号左边是列表 , 则是列表上下文 . Perl解释器会根据上下文来决定变量的类型

png

当将列表赋值给标量时 , 返回的是列表中元素的个数


标量

  • 整型

    Perl把整数存储到计算机的浮点寄存器中 , 所以整数实际上是被当作浮点数看待的 . 在大多数计算机中 , 浮点寄存器可以存储16位数字 , 长于16位的数会被丢弃 . 整数实际上是一种特殊形式的浮点数

    八进制整数表示 : " 0 + 八进制数 "

    十六进制整数表示 : " 0x + 十六进制数 "

  • 浮点数
    前面提到大多数计算机的浮点寄存器只能存储16位数字 , 所以浮点寄存器往往不能精确存储浮点数 , 会产生误差

    指数形式的数据也看作浮点数( 例如 4.3e+01 ) , 指数的范围为 [-309 , 308]

    png

    这里计算存在很大误差

  • 字符串
    字符串的使用与C语言类似 , 需要注意在Perl中字符串不能用\0来表示结束

    字符串中的单双引号的使用需要注意 , 双引号可以正常解析转义字符和变量 , 单引号不可以 .

  • 标量运算

    + : 两数相加
    * : 两数相乘
    . : 拼接字符串 / 拼接字符串或者数字

  • 多行标量

    可以使用引号包围 , 也可以使用 Here Document 语法

    png

    教程上说暑促多行字符串需要使用单引号( '' )而不是双引号( "" )

  • 特殊字符

    三个例子( __FILE__ , __LINE__ , __PACKAGE__ ) , 这些特殊字符是单独标记的 , 不能写在字符串中

    png

  • v字符串

    一个以v字开头 , 后面跟着一个或多个用点分割的整数 , 会被当成一个字符串文本

    简单的说 , 在输出时 , 如果这些整数可以被转换为ASCII字符 , 那么会被转换为字符 . 如果出现宽字符等Perl无法识别的内容 , 那么会被转换为十六进制的字符实体编码 , 以&#x开头 . ( Perl 只能处理 ASCII 和 UTF-8 , 如果 , 若出现Perl无法识别的字符 , 则会产生 Wide character in print 警告 )

    png

    若想为每个字符直接声明其数字值时 , 可以使用这种v字符串方法


数组

Perl中数组是一个存储标量值的列表变量 , 这些标量值可以是不同类型的

png

若要访问数组元素 , 可以使用 "$ + 变量名 + [ 索引值 ]" 的格式来读取

png

  • 创建数组

    创建数组时 , 可以使用 @ + 变量名 直接创建 , 也可以使用 qw// 运算符定义 , 或者是分别对空数组的每个索引进行赋值 .

    qw//运算符会返回字符串列表 , 列表中的元素以空格分割 , 所以可以用来创建数组

    png

  • 访问数组元素

    可以通过 $ + 变量名 + [ 索引值 ] 来访问数组 . 索引值可正可负 . 正数表示从前往后读取 , 负数则是从后往前读取

    png

    注意从前往后读取 , 第一位为 " 0 " . 从后往前读取 , 第一位为最大索引位

  • 数组序列号

    Perl 提供了可以按序列输出的数组形式 , 格式为 启始值..结束值

    png

  • 数组的大小

    数组的大小由赋值的标量上下文决定的 , 这点前面已经提到过了

    png

    注意数组的大小是指数组物理大小 , 而不是数组中元素的个数

    png

    可以看到数组中的元素只有21个 , 但是数组的大小为51

    $# + 变量名 返回数组的最大索引值( 从 0 开始 )

  • 添加或者删除数组元素

    Perl提供了一些有用的函数来添加或者删除数组元素

    • push @ARRAY,LIST : 将新列表放到原列表的末尾

      png

    • pop @ARRAY : 弹出并返回列表中最后的一个值

      png

    • shift @ARRAY : 弹出并返回列表的第一个值 , 此时列表的索引值会依次减1

      png

    • unshift @ARRAY,LIST : 将新列表放到原列表的开头 , 并且返回新列表的大小( 注意不是实际元素的个数 )

      png

  • 切割数组

    可以根据索引值切割一个数组

    png

    切割时的数组索引需要是有效的值 , 可以是正数或者负数( 无论正负都需要是由小到大启动 )

    每个索引值需要用逗号分割 , 如果想要连续的索引 , 可以使用 .. 来指定范围

  • 替换数组元素

    可以使用splice()函数来替换数组中的元素

    png

    splice(@ARRAY , OFFSET , LENGTH , LIST)
    @ARRAY : 原数组
    OFFSET : 从什么地方开始 , 注意这里是指索引 , 索引从 0 开始
    LENGTH : 替换元素的个数
    LIST : 替换元素的列表

  • 将字符串转换为数组

    Perl中使用splce()函数将字符串转换为数组

    png

    split(PATTERN , EXPR , LIMIT)
    PATTERN : 分割符 , 默认为空格
    EXPR : 需要分割的字符串
    LIMIT : 若设置该值 , 将会指定进行多少次分割

  • 将数组转换为字符串

    Perl中使用join()将字符串划分为数组

    png

    join(PATTERN , EXPR)
    PATTERN : 连接符 , 必须指定
    EXPR : 要转换的列表或者数组

  • 数组排序

    Perl中使用sort()函数进行数组排序

    png

    sort(SUBROUTINE , LIST)
    SUBROUTINE : 可选参数 , 指定排序规则
    LIST : 需要排序的列表

    数组排序默认是按照ASCII数字的大小进行排序的 , 因此在对数组进行排序时最好将每个元素全部转换为小写后再排序

  • 特殊变量 $[

    首先说下这个变量已经被弃用了 , 在 Perl 5.30 中将会生成错误

    特殊变量 $[ 表示数组的第一索引值 , 默认为0 , 但是如果将 $[ 设置为 1 , 那么数组的第一个索引值就变为了 1 , 依次类推

    png

  • 合并数组

    数组中的元素是用逗号分割的 , 这些元素也可以是数组 , 所以可以在数组中嵌入多个数组

    png

  • 批量提取数组中的元素

    png


哈希 HASH

哈希就是键值对的集合 , 也被称为关联数组 , Perl中哈希变量以百分号 " % " 标记开始

可以使用 $hash{key} 来获取对应的值

  • 创建哈希

    哈希可以通过赋值创建 , 也可以通过列表方式创建

    png

  • 访问哈希元素

    通过 $ + 变量名 + { key } 来访问哈希元素

    png

  • 批量读取哈希值

    通过 @ + 变量名 + { key1 , key2 , ... } 来读取哈希值

    png

  • 读取所有的哈希 key 和 value

    通过 keys + % + 变量名values + % + 变量名 可以获取到所有的 key 和 value

    png

  • 检测元素是否存在

    在哈希中读取不存在的键值对时 , 会返回 undefined 值 , 并且在执行时会产生警告

    可以使用 exists() 函数来判断key是否存在

    png

  • 获取哈希的大小

    哈希的大小是指元素的个数 , 可以通过获取 key 或者 value 的值 , 把他们组成一个数组 , 再读取这个数组的大小.

    png

  • 添加或者删除元素

    通过赋值的方法添加键值对 , 通过delete()函数删除键值对.

    png


总结

本章总结了 Perl 三个基本数据类型的知识

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇