发布新日志

  • Linux主要服务简介

    2015-10-05 08:12:29

    DHCP (Dynamic Host Configuration Protocol)

    自动的将网络参数正确的分配给网域中的每部计算机, 让客户端的计算机可以在开机的时候就立即自动的设定好网络的参数值,这些参数值可以包括了 IPnetmasknetworkgateway DNS 的地址等

    NFS (Network FileSystem)

    它最大的功能就是可以透过网络,让不同的机器、不同的操作系统、可以彼此分享个别的档案 (share files)。所以,你也可以简单的将他看做是一个文件服务器 (file server)

     NFS 服务器可以让你的 PC 来将网络远程的 NFS 服务器分享的目录,挂载到本地端的机器当中, 在本地端的机器看起来,那个远程主机的目录就好像是自己的一个磁盘分区槽一样 (partition)

    RPC (Remote Procedure Call)

    RPC 最主要的功能就是在指定每个 NFS 功能所对应的 port number ,并且回报给客户端,让客户端可以连结到正确的埠口上去

    NIS(Network Information Services)

    NIS 主要提供的是用户的账号、密码、家目录文件名、UID等信息

    作为账号主控服务器来管理网域中所有主机的账号, 当其他的主机有用户登入的需求时,才到这部主控服务器上面要求相关的账号、密码等用户信息, 如此一来,如果想要增加、修改、删除用户数据,只要到这部主控服务器上面处理即可, 这样就能够降低重复设定使用者账号的步骤

    端文件名

    档案内容

    /etc/passwd

    提供用户账号、UIDGID、家目录所在、Shell 等等

    /etc/group

    提供群组数据以及 GID 的对应,还有该群组的加入人员

    /etc/hosts

    主机名与 IP 的对应,常用于 private IP 的主机名对应

    /etc/services

    每一种服务 (daemons) 所对应的埠口 (port number)

    /etc/protocols

    基础的 TCP/IP 封包协定,如 TCP, UDP, ICMP

    /etc/rpc

    每种 RPC 服务器所对应的程序号码

    /var/yp/ypservers

    NIS 服务器所提供的数据库

     

    NTP Network Time Protocol

    时间同步,选择几部主要主机 (Primary server) 调校时间,让这些 Primary Servers 的时间同步之后,再开放网络服务来让 Client 端联机,并且提供 Client 端调整自己的时

    SAMBA

    Windows Unix-Like 这两个不同的平台相互分享档案数据的文件系

     

    NFS CIFSSAMBA的区别

    NFS Unix Like 的机器互相分享档

    CIFSCommon Internet File System Windows 机器互相分享档

    SAMBA Windows Unix-Like 这两个不同的平台相互分享档案数据的文件系

     

    Proxy

    以类似代理人的身份去取得用户所需要的数据,当客户端有因特网的数据要求时,Proxy 会帮用户去向目的地取得用户所需要的数据可以透过代理服务器来达成防火墙功能与用户浏览数据的分析。也可以藉由代理服务器来达成节省带宽的目的,以及加快内部网络对因特网的 WWW 访问速

     

    NAS (Network Attached Storage, 网络附加储存服务器)

    NAS 其实就是一部客制化好的主机了,只要将 NAS 连接上网络,那么在网络上面的其他主机就能够存取 NAS 上头的资料了。简单的说,NAS 就是一部 file server 

    低阶的 NAS 通常会使用 Linux 系统搭配软件磁盘阵列来提供大容量文件系NAS 也通常支持 TCP/IP ,并会提供 NFS, SAMBA, FTP 等常见的通讯协议来提供客户端取得文件系统

    NAS 会包括很多组态的接口,通常是利用 Web 接口来控制磁盘阵列的设定状况、提供 IP 或其他相关网络设定, 以及是否提供某些特定的服务等

    SAN (Storage Area Networks, 储存局域网络)

    SAN 却可以透过某些特殊的接口或信道来提供局域网络内的所有机器进行磁盘存

    SAN 是提供『磁盘 (block device)』给主机用,而不是像 NAS 提供的是『网络协议的文件系统 (NFS, SMB...)挂载使用 SAN 的主机会多出一个大磁盘,并可针对 SAN 提供的磁盘进行分割与格式化等动

     

    SANNAS的区别

    SAN 可以提供磁

    NAS 则是提供相关的网络文件系

    NAS 能透过网络去使用 SAN 所提供的磁

    DAS直接存取 (direct-attached storage)例如本机上面的磁盘,就是直接存取设备;

    SAN透过储存局域网络 (SAN)来自区网内的其他储存设备提供的磁盘;

    NAS网络文件系统 (NAS)来自 NAS 提供的文件系统,只能立即使用,不可进行格式化

    iSCSI 

    iSCSI 主要是透过 TCP/IP 的技术,将储存设备端透过 iSCSI target (iSCSI 目标) 功能,做成可以提供磁盘的服务器端,再透过 iSCSI initiator (iSCSI 初始化用户) 功能,做成能够挂载使用 iSCSI target 的客户端,如此便能透过 iSCSI 协议来进行磁盘的应用了

    iSCSI 这个架构主要将储存装置与使用的主机分为两个部分,分别是:

    • 查看(839) 评论(0) 收藏 分享 管理

    • shell-文本处理工具

      2015-01-23 06:59:10

      排序文本
      含有独立数据记录的文本文件,通常都可以拿来排序。
      Sort将输入看作具有多条记录的数据流,而记录是由可变宽的字段组成,记录是以换行字符作为定界符
      ,字段的定界符则是空白字符或是用户指定的单个字符。
      sort [options]  [files]
      行的排序
      未提供命令行选项时,整个记录都会根据当前locale所定义的次序排序。排序的惯例,完全视语言,国
      家以及文化而定。
      以字段排序
      如果要进一步控制排序操作,可以用-k选项指定排序字段,并且用-t选项来选择字段定界符。
      如未指定-t, 则表示字段以空白分隔且记录内开头与结尾的空白都将忽略,如指定-t选项,则被指定的
      字段会分隔字段,且空白是有意义的。
      -k 选项的后面接着的是一个字段编号,或者是一对数字,有时在-k之后可用空白分隔,每个编号后面都
      可以接一个点号的字符位置,及/或修饰符字母之一。
      如果仅指定一个字段编号,则排序键值会自该字段的起始处开始,一直继续到记录的结尾(而非字段的结
      尾)
      如果给的是一对用逗号隔开的字段数字,则排序键值将由第一个字段值的起始处开始,结束于第二个字
      段值的结尾。
      如果使用点号字符位置,则比较的开始或结束在该字符位置处
      如果一个排序键值的起始正好落在记录的结尾处之后,则排序键值为空,且空的排序键值在排序时将优
      先于所有非空的键值。
      当出现多个 -k选项时,会先从第一个键值字段开始排序,找出匹配该键值的记录后,再进行第二个键值
      字段的排序。
      删除重复
      sort -u 消除操作是根据匹配的键值,而非匹配的记录,uniq命令提供另一种过滤数据的方式,它常用

      于管道中,用来删除已使用sort排序完成的重复记录
      sort ... | uniq | ....
      uniq有3个好用的选项, -c可在每个输出行之前加上该行重复的次数 -d选项则用于仅显示重复的行,而
      -u仅显示未重复的行。
      格式化段落
      fmt 
      -s 选项仅切割较长的行,但不会将短行结合成较长的行,而-w n则设置输出行宽度为n 个字符
      计算行数,字数以及字节数
      wc 默认输出是一行报告,包括行数,字数以及字节数
      要求仅输出部分结果时,可使用选项 -c 字节数 -l 行数 -w 字数 -m 计算多字节字符
      wc最常处理的是来自于管道的输入数据,但它也接受命令行的文件参数,可以生成一行一个结果,再附
      上报告。
      wc的新版本会随local而有不同结果,将环境变量LC_CTYPE设为想用的locale,会影响wc把字节序列解释
      为字符或单词的分隔器。
      提取开头或结尾数行
      head -n n
      sed -e nq
      tail -n n
      tail -n n -f  -f要求tail显示指定的文件结尾行数,接着进入无止尽的循环中,休息一秒后又再度醒
      来并检查是否需显示更多的输出结果。 在设置-f时,tail只有当你中断时才会停止,通常用Control+C
      来中断
      由于tail加上-f 选项后便不会自己中断,所以此选项不可用于Shell脚本。
      dd 以用户指定的的块大小与数据拷贝数据,可以进行大小写转换,以及ASCII与EBCDIC间的转换
      file 将其参数文件内容的前几个字节,与样式数据库进行比对,再在标准输出下,针对各文件显示一行
      简短报告
    • shell-查找与替换

      2015-01-20 22:29:12

      文本查找--寻找含有特定文本的行 
      文本替换--更换找到的文本
      用grep程序查找文本,grep最简单的用法就是使用固定字符串
      语法 grep [options] pattern-spec [files..]
      正则表达式
      正则表达式是一种表示方法,让你可以查找匹配特定准则的文本。
      正则表达式是由两个基本组成部分所建立,一般字符与特殊字符。一般字符指的是任何没有特殊意义额字符,特殊字符常称为元字符。有些情况下,特殊字符也可以视为一般字符。
      基本正则表达式
      匹配单个字符
      一般字符包括所有文字和数字字符,绝大多数的空白字符以及标点符号字符。因此,正则表达式a 匹配于字符a,一般字符所表示的就是它们自己。
      meta字符不能表示他们自己,需要表示他们自己的时候需要转义,加反斜杠(\)
      点(.)字符为任一字符,因为a.c匹配abc,aac,acc等,
      方括号([]),最简单的方括号表达式就是直接将字符串列表放在方括号里。c[aeiou]t匹配与cat,cet等,但不保活cbt等。
      在方括号里,^放在字首表示是取反。也就是不在方括号里的任一字符。c[^aeiou]t,可表示cbe,但不保活cat.
      方括号表达式可以包括字符的范围,[1--9],[a--f]
      排序是指给予成组的项目排列顺序的操作
      等价字符集用来让不同字符在匹配时视为相同字符。
      字符集,它表示字符的类别,例如数字,小写与大写字母,标点符号,空白等,这些类别名称定义于[:与:]之间
      在方括号表示式中,所有其他的meta字符都会失去其特殊含义,所以[*\.]匹配于字面上的星号,反斜杠以及句号,要让]进入该集合,可以将它放在列表的最前面,[]*\.], 将]增加至此列表中,要让减号字符进入该集合,也请将它放到列表的最前端[-*\.],若你需要右方括号与减号两者进入列表,将右括号放在第一个字符,减号放到最后一个字符[]*\.-]
      NULL字符(数值的零)不需要是可匹配的。
      向后引用
      向后引用的机制指的是匹配于正则表达式匹配的先前的部分。使用向后引用的步骤有两个,第一步是将子表达式包围在\(与\)里。单个模式里可包括至多9个子表达式,且可为嵌套结构
      digit指的是介于1到9的数字
      单个表达式匹配多个字符
      匹配多个字符最简单的方法就是把他们一个接一个连接列出来,所以正则表达式ab匹配ab
      两个点号(..)匹配任一两个字符[:upper:][:lower:]则匹配于任意一个大写字符,后面接着任意一个小写字符。
      修饰符(*)表示匹配0个或多个前面的单个字符,ab&c可以表示ac,abc,abbc 0个或多个b
      区间表达式,可以表明需要匹配的次数
      \{n\} 前置正则表达式所得结果出现n次
      \{n,\} 前置正则表达式所得的结果重现至少n次
      \{n,m\}前置正则表达式所得的结果重现n至m次
      文本匹配锚点
      脱字符号(^)与货币符号($)叫做锚点,其用途在限制正则表达式匹配时,针对要被匹配字符串的开始或结尾处进行匹配。(^在此处的用法与方括号表达式里的完全不同)
      ^用于字符串开始匹配,&用于字符串结尾处进行匹配。
      ^与$可同时使用,这种情况是将括起来的正则表达式匹配整个字符串。
      ^$用来匹配空的字符串或行列
      BRE 基本正则表达式
      ERE 扩展正则表达式
      ERE有另两个meata字符
      匹配单个正则表达式与多个正则表达式
      ? 匹配于0个或一个前置正则表达式 ab?c, ac,abc
      + 匹配于1个或多个前置正则表达式,ab+c,, abc,abbc,abbbc
      交替
      交替运算符,即垂直的一条线,称为管道字符| read|write匹配于read与write两者。
      分组
      在ERE里,运算符是被应用到前置的正则表达式。
      正则表达式的扩展
      \<与\>运算符,分别匹配单词的开头和结尾

    • shell-查找与替换

      2015-01-20 22:29:12

      文本查找--寻找含有特定文本的行 
      文本替换--更换找到的文本
      用grep程序查找文本,grep最简单的用法就是使用固定字符串
      语法 grep [options] pattern-spec [files..]
      正则表达式
      正则表达式是一种表示方法,让你可以查找匹配特定准则的文本。
      正则表达式是由两个基本组成部分所建立,一般字符与特殊字符。一般字符指的是任何没有特殊意义额字符,特殊字符常称为元字符。有些情况下,特殊字符也可以视为一般字符。
      基本正则表达式
      匹配单个字符
      一般字符包括所有文字和数字字符,绝大多数的空白字符以及标点符号字符。因此,正则表达式a 匹配于字符a,一般字符所表示的就是它们自己。
      meta字符不能表示他们自己,需要表示他们自己的时候需要转义,加反斜杠(\)
      点(.)字符为任一字符,因为a.c匹配abc,aac,acc等,
      方括号([]),最简单的方括号表达式就是直接将字符串列表放在方括号里。c[aeiou]t匹配与cat,cet等,但不保活cbt等。
      在方括号里,^放在字首表示是取反。也就是不在方括号里的任一字符。c[^aeiou]t,可表示cbe,但不保活cat.
      方括号表达式可以包括字符的范围,[1--9],[a--f]
      排序是指给予成组的项目排列顺序的操作
      等价字符集用来让不同字符在匹配时视为相同字符。
      字符集,它表示字符的类别,例如数字,小写与大写字母,标点符号,空白等,这些类别名称定义于[:与:]之间
      在方括号表示式中,所有其他的meta字符都会失去其特殊含义,所以[*\.]匹配于字面上的星号,反斜杠以及句号,要让]进入该集合,可以将它放在列表的最前面,[]*\.], 将]增加至此列表中,要让减号字符进入该集合,也请将它放到列表的最前端[-*\.],若你需要右方括号与减号两者进入列表,将右括号放在第一个字符,减号放到最后一个字符[]*\.-]
      NULL字符(数值的零)不需要是可匹配的。
      向后引用
      向后引用的机制指的是匹配于正则表达式匹配的先前的部分。使用向后引用的步骤有两个,第一步是将子表达式包围在\(与\)里。单个模式里可包括至多9个子表达式,且可为嵌套结构
      digit指的是介于1到9的数字
      单个表达式匹配多个字符
      匹配多个字符最简单的方法就是把他们一个接一个连接列出来,所以正则表达式ab匹配ab
      两个点号(..)匹配任一两个字符[:upper:][:lower:]则匹配于任意一个大写字符,后面接着任意一个小写字符。
      修饰符(*)表示匹配0个或多个前面的单个字符,ab&c可以表示ac,abc,abbc 0个或多个b
      区间表达式,可以表明需要匹配的次数
      \{n\} 前置正则表达式所得结果出现n次
      \{n,\} 前置正则表达式所得的结果重现至少n次
      \{n,m\}前置正则表达式所得的结果重现n至m次
      文本匹配锚点
      脱字符号(^)与货币符号($)叫做锚点,其用途在限制正则表达式匹配时,针对要被匹配字符串的开始或结尾处进行匹配。(^在此处的用法与方括号表达式里的完全不同)
      ^用于字符串开始匹配,&用于字符串结尾处进行匹配。
      ^与$可同时使用,这种情况是将括起来的正则表达式匹配整个字符串。
      ^$用来匹配空的字符串或行列
      BRE 基本正则表达式
      ERE 扩展正则表达式
      ERE有另两个meata字符
      匹配单个正则表达式与多个正则表达式
      ? 匹配于0个或一个前置正则表达式 ab?c, ac,abc
      + 匹配于1个或多个前置正则表达式,ab+c,, abc,abbc,abbbc
      交替
      交替运算符,即垂直的一条线,称为管道字符| read|write匹配于read与write两者。
      分组
      在ERE里,运算符是被应用到前置的正则表达式。
      正则表达式的扩展
      \<与\>运算符,分别匹配单词的开头和结尾

    • Perl-目录操作

      2015-01-12 08:04:05

      在目录树中移动
      程序在运行时会以自己的工作目录作为相对路径的起点。
      可以使用chdir操作来改变当前的工作目录,和Unix Shell的cd命令差不多
      chdir /etc
      chdir是一个对操作系统的调用,苏一发生错误时便会设定标量变量$!的值,如果chdir的值返回为假,则表示有些事情没有顺利完成,应该检查一些$!中的错误原因。
      由Perl程序启动的所有进程都回继承Perl程序的工作目录,可以目录的更改却无法影响调用Perl程序的
      进程比如shell.这并不是Perl的限制,而是Unix,Windows和其他一些操作系统的一个特性,这意味着你
      没有办法写出可以代替shell里的cd命令的Perl程序,因为一旦推出Perl程序,又会回到启动Perl程序时所在的目录的工作目录。如果调用chdir时不加参数,会回到用户主目录,并试着将工作目录设成主目录。
      文件名通配
      一般来说,shell会将命令行里的文件名模式展开成所有匹配的文件名,称为文件名匹配。
      例如*.pm, 
      有时候在程序内部也可能需要*.pm之类的模式,可以用glob操作符
      glob '*'; 会取得当前目录中的所有文件并按字母顺序排序,但不包括以点号开头的文件。
      glob '*.pm'; 取得当前目录中所有以.pm结尾的文件。
      任何能够在命令行上键入的模式都可以作为唯一的参数交给glob来处理,如果要一次匹配多种模式,可
      以在参数中用空格隔开各个模式
      glob '.* *';
      .*参数可以取得所有的文件名,无论它们是否以点号开始,两个条目之间的空格是有意义的,它分隔了
      两个要进行文件名通配处理的条目。
      文件名通配的另一种写法
      <*> 用尖括号语法 Perl会把尖括号内出现的变量替换成它的值,类似于双引号内字符串的变量内插,这
      表示在进行文件名通配之前,尖括号内的Perl变量会先被展开成它们的值。
      尖括号既表示从文件句柄读取又代表文件名通配操作,如果尖括号内是满足Perl标识符条件的,就作为文件句柄来读取,否则他表示的是文件名通配操作。
      当尖括号内仅是一个简单的标量变量(不是哈希或数组元素)时,那么它就是间接文件句柄读取,其中变量的值就是待读取的文件句柄名称。
      Perl在编译阶段决定它是文件名通配符还是从文件句柄读取,和变量的内容无关。 
      目录句柄
      目录句柄开起来像文件句柄,使用起来也没有多大区别。你可以打开它(opendir),读取它的内容
      (readdir),然后将它关闭(closedir),只不过读到的是目录里的文件名(或其他东西的名称 ),而不是文件
      的内容。和文件句柄一样,目录句柄会在程序结束时自动关闭,也会在用这个句柄再打开另一个目录前自动关闭.
      目录句柄返回的名称列表并未按照任何特定的顺序排序,列表中将会包含所有的文件,而不只是匹配某
      些模式的部分。
      readdir操作符返回的文件名并不包含路径名,它们只是目录里的文件名而已。 所以得加上路径名称才有办法得到文件的全名。
      若是没有接上路径,文件测试操作符会在当前目录下查找文件,而不是在$dirname指定的目录下。
      递归访问目录
      可以使用File::Find模块来完成目录的递归处理
      文件和目录的操作
      删除文件
      在Perl里面,使用unlink操作符,并指定要删除的文件列表
      unlink 'a','b','c';
      unlink的参数是一个列表,glob函数又返回的是一个列表,可以联合两者,一次性删除多个文件
      unlink glob '*.pm'
      unlink的返回值代表成功删除的文件数目,0代表一个都没有删,大于0,代表至少删除一个成功。
      unlink执行失败时,内置的$!变量会被设成操作系统错误的相关信息,此变量只有在循环处理每一个文件的过程中才可用,因此每次系统调用失败时都会重设该变量的内容。
      unlink不能用来删除目录,。
      在Unix上,某个文件你无法读取,写入,执行,拥有,但是你可以删除它,因为删除文件的权限跟文件
      本身的权限位无关,它取决于文件所在的目录的权限位。
      重命名文件
      rename函数 rename 'old', 'new';
      可以将文件移到其他目录中 rename '/etc/old','new';
      也可以用胖箭头,rename '/etc/old'=>'new';
      只要运行程序的用户拥有足够的权限,可以将文件从其他目录移到当前目录
      和大部分调用操作系统功能的函数一样,rename执行失败时返回假,并将操作系统返回的错误信息保存在$!中。 rename虽然可以将文件移到别的目录中,但是来源和目的地必须在同一个文件系统(挂载卷)上。
      链接(hard link)与文件
      挂载券指的是硬盘或相似设备。其中可能含有任意数目的文件和目录,每个文件都存储在编号的innode对应的位置中,不过,寻找某个特定的文件时,我们得从它的目录找起。
      目录是一种由操作系统管理的特殊文件。基本上目录是一份文件名和相应的inode编号的对照表
      目录列出来的内容一定会有两个特殊条目,一个是.(点),代表目录本身,另一个是..(点点),指的是目录结构中高一层的目录(也就是它的上层目录)要在指定目录中创建一个新文件时,系统会新增一个条目来记录文件名与新的inode编号。每个inode都有自己的链接数。如果inode并未出现在任何目录中,它的链接数一定是零。所有链接数为零的inode都可以用来存放新的文件。每当inode被列入目录中,链接数就会递增,当它在目录的列表里被删除时,链接数就会递减。任何目录的链接数都至少是2,一个位于他的上层目录的列表里,另一个位于它本身的列表里。如果目录有子目录,则每个子目录还会通过..(点点)再增加一个链接,目录的链接数一定等于子目录数量加上2.链接数代表的是inode真是名称的数量。 可以通过对文件建链接的方式,将两个文件名指向同一个文件存储。link 'filename','another file name'关于目录列表里的链接还有一条规定,就是在目录列表中所有的inode指向的文件都必须在同一个挂载券中。即使将物理介质移到另一个机器上,其中的目录和文件的链接仍然有效。如果要跨磁盘移动文件,就必须重新部署inode的数据。链接的另一个限制就是不能为目录建立额外的名称,这是因为目录必须按照层次排列。因此,不能增加目录的链接数,也不能跨挂载券链接。
      符号链接(symbolic link, soft link)
      符号链接也叫软链接,是目录里的一种特殊条目,用来告诉系统实际文件放置在别的地方。
      符号链接和硬链接不同,它可以跨文件系统为目录建立软链接,(也就是一个新的目录名),事实上,
      符号链接能指向任何文件名,而不管它放在哪个目录里。甚至还可以指向不存在的文件。软链接不像硬
      链接那样可以防止数据丢失。因为它不会增加inode的个数。
      软链接可以指向目前还不存在的文件,所以在创建文件时很有用。软链接目录下创建的文件,真实的位
      置在原文件目录下。 要取得符号链接指向的位置,可以使用readlink函数,它会返回富豪链接指向的位置。如果参数不是符号链接,则返回undef.软链接和硬链接都可以用unlink移除,unlink只是从目录里移除该文件名的链接条目,并将他的链接数递减,必要时再释放inode.
      创建和删除目录
      mkdir 创建目录,返回真表示创建成功,失败时会设定$!的值。
      rmdir 移除空目录,和unlink很像,不过每次调用只能删除一个目录 
      对非空目录调用rmdir函数会导致失败,可以先用unlink删除目录中的内容,再试着移除已经清空的目录 
      修改权限
      chmod 可以用来修改文件和目录的权限。chmod会返回成功更改的条目数量,哪怕只有一个参数,它也会
      在失败时将$!设成合理的错误信息。 Perl下的chmod不能接受符号修改参数,只能用数字。
      修改隶属关系
      chown 修改一些列文件的拥有者以及其所属组。拥有者和所属组会被同时修改,并且在指定时必须给出
      数字形式的用户标识符及组标识符。如果处理的不是数字,而是字符串,可以用getpwnam函数将用户转换成用户编号,getgrnam函数把用户组名转换成组编号.hown函数会返回受影响的文件数量,在错误发生时会在$!中设定出错的信息。
      修改时间戳
      utime 修改某个文件的最近的更改或访问时间。它的前两个参数是新的访问时间和更改时间。其余参数就是要修改时间戳的文件名列表。时间格式采用的是内部时间戳的格式。time函数可以返回当前的时间
      当文件有任何更改时,ctime的值一定会被设为now. utime函数没办法修改ctime. ctime主要是用来给增量备份程序用的。

    • 围棋-领土,边,线,气

      2015-01-11 21:33:03

      围棋是将黑白棋子交替在棋盘上下子并占领领土的运动,即黑白双方根据占领土地的多少来决定胜负
      领土
      决定胜负的是目数,也即领土
      领土的条件1,领土必须由一方棋子围成
      领土的条件2,对方没有从外侧侵入的余地才能成为己方的领土
      领土的条件3,对方不可能在己方的领土内活出一块棋,如果占的区域空间太大,对方还是可能入侵
      盘上各个区域的名称
      角和边的名称是根据位置而定的。
      左上角 左上角是指位于棋盘上方左侧的角
      右上角 右上角是指位于棋盘上方右侧的角
      上边 上边是指棋盘上部的边
      下边 下边是指棋盘下部的边 
      中腹 中腹是指棋盘中央的部分
      左边 左边是指棋盘的左边
      右边 右边是指棋盘的右边
      盘上各条线的名称
      围棋盘由纵横各十九条线组成
      最上边的线称为一路线,一路线又称为死亡线
      第二条线称为二路线
      第三条线称为三路线,三路线又称为地域线,因为较容易围地
      第四条线称为四路线,四路线又称为势力线,因为具有形成很强的形成势力的可能
      一路和二路由于位置太低,棋子尽量不要下到一路和二路
      棋子长下到三路线和四路线
      棋子的气
      将棋子周围空着的位置称为气。正左,正右,正上,正下四个方向。如果棋子无气,则被提出盘外,气越少,棋子离死亡也就越紧。棋子要在棋盘上存活,确保很多气很重要,长是涨气的一种好方法。

    • Perl-文件测试

      2015-01-11 08:17:42

      通常,打开文件的操作会直接创建一个新文件,如果存在同名的文件的话,还会清空该该文件的内容。所以操作文件时需要对文件进行一些检测
      文件测试操作符
      Perl提供了一组测试文件的操作符,借此返回特定的文件信息。所有这些测试操作符都写作-X的形式,其中X表示特定的测试操作。绝大多数测试操作符返回布尔真假值
      -e
      在运行会创建文件的程序前,应先检查指定文件是否已经存在,以免意外覆盖文件,
      if -e $filename;
      -M
      -M文件测试操作符返回的是文件最后一次修改时间到当前程序启动时刻之间的天数。测试的是一个已经存在的文件句柄,而非文件名的字符串
      if -M CONFIG>28;
      -s 
      -s文件操作符返回的并不是布尔真假值,而是以字节计算的文件大小(已经存在的空文件大小可以使零字节)
      -r 文件或目录,对目前(有效的)用户或组来说是可读的
      -w 文件或目录,对目前(有效的)用户或组来说是可写的
      -x 文件或目录,对目前(有效的)用户或组来说是可执行的
      -o 文件或目录,对目前(有效的)用户拥有
      -R 文件或目录,对实际的用户或组来说是可读的
      -W 文件或目录,对实际的用户或组来说是可写的
      -X 文件或目录,对实际的用户或组来说是可执行的
      -O 文件或目录,对实际的用户拥有
      -e 文件或目录,是存在的
      -z 文件存在而且没有内容(对目录来说永远为假)
      -s 文件或目录存在而且有内容(返回值是以字节为单位的文件大小)
      -f 是普通文件
      -d 是目录
      -l 是符号链接
      -S 是socket类型的文件
      -p 是命名管道,也就是先入先出队列
      -b 是块设备文件(比如某个可挂载的磁盘)
      -c 是字符设备文件(比如某个I/O设备)
      -u 文件或目录设置了 setuid位
      -g 文件或目录设置了 setgid位
      -k 文件或目录设置了 sticky位
      -t 文件句柄是TTY设备(类似系统函数isatty()的测试,不能对文件名进行测试)
      -T 看起来像文本文件
      -B 看起来像二进制文件
      -M 最后一次被修改到今天的天数 
      -A 最后一次被访问到几天的天数
      -C 最后一次文件节点编号被改变后至今的天数
      -r,-w,-x这几个操作符测试的是有效用户或组的ID,看他们是否有相应的文件权限,所谓有效用户,指的是负责运行这个程序的人这些测试会查看文件的权限位,以此判断哪些操作时允许的。如果系统使用访问控制列表,那么这些测试将根据该列表进行判断,
      Unix文件系统上有且仅有7种文件类型,分别由以下7种文件测试操作符代表。
      -f,-d,-l,-S,-p,-b,-c 
      测试同一文件的多项属性
      如果要一次测试某个文件的若干属性,可以将各个文件测试组成一个逻辑表达式。比如想操作那些既可读又可写的文件,可以依次检查这两个属性并用and合并起来,
      if(-r $file and -w $file)
      但是这种方式非常消耗系统资源,因为Perl每次都在内部做了一次stat操作,拿到了文件的所有信息。
      Perl有个特别的简写可以避免这种重复运动,它就是虚拟文件句柄_(下划线字符),它会告诉Perl用上次查询过的文件信息来做当前测试。Perl只需要查询一次文件信息就可
      if(-r $file and -w_)
      并非只能在一条语句中连续使用_,但是必须保证两次查询的是同一个文件
      栈式文件测试操作符
      从5.10开始允许我们使用栈式写法将文件测试操作符排成一排,放在要测试的文件名前
      if(-w -r $file)
      使用栈式写法时,靠近文件名的测试会先执行,次序为从右往左。 
      stat和lstat函数
      stat函数返回文件所有信息。stat函数的参数可以是文件句柄(包括虚拟文件句柄),或是某个会返回文件名的表达式。如果stat执行失败(通常是由于无效的文件名或是文件不存在),它会返回空列表。要不然返回一个含13个元素的数字列表。
      $dev $ino $mode $nlink $uid $gid $rdev $size $atime $mtime $ctime $blksize $blocks
      localtime函数
      localtime函数在标量上下文中可以完成时间戳到时间的转换
      在列表上下文中,localtime会返回一个数字元素组成的列表。
      $sec, $min $hour $day $mon $year $wday $yday $isdst
      按位运算操作符
      按位操作运算符对数据进行二进制数学运算。
      &按位与操作符会给出两边参数对应的位置中哪些位同时为1按位与操作符只有在两边相应的位均为1时才会产生1,
      |按位或,在两边相应的位有一个为1则返回1
      ^按位异或,哪些位在任何一边为真则返回真,但不能两边都为真。
      << 按位左移将左边操作数向左移动数位,移动位数由右边操作数指定,并以0来填补最低有效位
      >> 按位右移,将左边操作数向右移动位数,移动位数由右边操作数指定,并丢弃移出的最低有效位
      ~取按位取反,返回操作数逐位取反之后的数值
      按位左移
    • Perl-Perl模块

      2015-01-11 08:16:28

      Perl模块有两种来源,一种是随Perl发行版本一同打包的,所以安装了Perl就可以利用这些Perl.另一种则需要从CPAN下载,需要从CPAN下载,需要自己安装 。
      安装模块
      如果想要安装系统上没有的模块,一般来说,需要先下载打包发布的的模块文件包,解压后在shell中运行一系列编译安装命令。
      如果模块使用MakeMaker封装,可以用下面的流程来安装
      1 perl Makefile.pl
      2 make install
      如果你没有权限安装模块到系统级目录,(安装后其他用户也可以使用的目录),则可以在Makefile.pl后面加上INSTALL_BASE参数 指定以你用户身份可写的安装目录:
      perl Makefile.PL INASTALL_BASE=/Users/fred/lib
      有些Perl模块开发者用的是另一个辅助模块Modules::Build来编译并安装他们的作品,可以用以下流程安装
      1 Perl Build.pl
      2 ./Build install 
      你可以指定自己的安装目录 
      有些模块的工作依赖与其他模块,所以必须先安装好这些前置模块,才能继续编译安装
      可以在命令行启动CPAN.pm自己的shell.
      perl -MCPAN -e shell
      还可以使用cpan, 只要把想安装的模块的名称列在它后面就行了。
      cpan Module::CoreList LWP CGI:: Prototype
      如果使用的是ActivePerl Windows上可以使用Perl包管理器(Perl Package,Manager,简称PPM)
      cpanm 可以从http://xrl.us/cpanm下载该脚本文件到本地。
      cpanm DBI WWW::Mechanize
      安装到自己的模块
      CPAN工具默认会把模块安装到与Perl解释器相同的目录,但你可能没有往这个系统级别的目录写文件的权限
      可以通过local::lib模块安装新模块到自己的用户目录下。需要自己下载local::lib,这个模块会自动修改某些环境变量设定,借此影响CPAN客户端安装模块的位置。 在命令行上加载该模块而不做任何操作,就行列出它所改动的所有环境变量设定
      perl -Mlocal::lib
      如果使用-I开关,cpan客户端就会参照上面列出的环境变量安装指定的模块
      cpan -I Set::Crossproduct. 
      cpamn :如果你已经设置了那些local::lib会帮你设置的环境变量的话,它会直接按照这些设定安装,如果没有,它会检查对默认的安装目录是否拥有可写权限,如果没有权限,它会自动帮你加载local::lib模块,如果你想显示声明使用local::lbi,可以这么做
      cpanm --local-lib HTML::Parser
      在选定安装Perl模块的路径后,要告诉程序到哪里才能找到这些模块,如果用的是local::lib,只需在程序内部加载该模块
      use local::lib;
      如果你装在其他地方,可以使用编译指令lib指定这个路径
      use lib qw(/Users/)
      使用简易模块
      use module_name
      仅使用模块中的部分函数
      只需在模块导入时的use 声明中加上导入列表来指明要导入的函数清单,就不会自动导入所有函数了。
      use module_name qw /subrountine_name/
      use module_name qw // 表示我们完全不要引入任何新函数。 
      也可以写成空的括号表示一个都不导入 use module_name ();
      导入模块中的函数的目的是要使用简短的函数名称,如果导入模块,但不导入函数,我们还可以通过全名的方式来调用相应的函数。
      调用函数的格式
      Module_name::subrountine_name
      调用方法的格式
      class_name->mechod_name (->称为瘦箭头) 看到瘦箭头,说明是面向对象的写法。
      use module_name qe(:all) 是一种导出标签,用来指定一组要导出的函数而非一个
       

    • Perl-循环控制结构

      2015-01-09 07:40:58

      Unless控制结构
      在if控制结构中,只有当条件表达式为真时,才执行某块代码,如果你想让代码块在条件为假时才执行,可以把if 改为unless. unless类似于一个独立的else语句。当unless执行条件为真时,不执行unless
      下面的语句块,如果unless执行条件为假,执行后面的代码 。
      unless(x=Y){
        do;
      }
      Unless可以跟else子句,和 if else逻辑完全相反。
      unless(x=y){
      do
      } else{
      do;
      }
      Until控制结构
      until 类似一个改装过的while循环,untill会在条件为假时重复执行,而不是条件为真时执行。
      表达式修饰符
      until (x>y){
      do;
      }
      为了进一步简化代码,表达式后面可以接一个用于控制它行为的修饰符
      print "$x" if @x <0;
      if($x<0){
      print "$x";
      }
      即使条件表达式写在后面,它仍然会先执行。这与通常由左到右的顺序相反。解读perl代码的方式应该
      像Perl的内部翻译器一样,先把语句全部读完再判断其含义。
      裸块控制结构
      所谓的裸块,就是没有关键字或条件表达式的代码块。
      {
      }
      裸块可以为临时词法变量限定作用域。 局部变量的准则,最好把变量声明在最小使用范围之内。
      elsif子句
      如果需要逐项检查一系列的表达式,看看其中哪个为真,可以通过if控制结构的else子句完成此事,Perl
      会一个接一个地测试这些条件表达式,当其中某项符合时,相应的程序代码块就会被执行,然后整个控
      制结构结束,并执行下来的代码程序。 
      If(){
      } elsif {
      } elsif {
      }
      elsif 并不是elseif.这个和其他语言不同
      自增和自减
      x++ 先使用x的值,然后x加
      ++x 先增加x的值,然后使用x的新值
      x-- 先使用x的值,然后x减
      --x 先减少x的值,然后使用x的新值
      如果操作符在前,就先自增或自减,然后使用新值,如果变量在前,则先返回它的值,然后再自增或自减
      for控制结构
      for (初始化;测试;递增){
      程序主体;
      }
      for循环最常见的用途,就是控制重复的运算过程。
      foreach和for之间的关系
      在Perl解析器里,foreach和for这两个关键字实际上是等价的。Perl可以从圆括号里面的内容判断出你
      到底想用for还是foreach。如果里面有两个分号,他就是之前介绍的for循环,若没有分号,就说明他是
      一个foreach循环
      循环控制
      Perl是一种所谓的结构化的编程语言,Perl的程序的任何块都只有一个入口,也就是块的顶端。
      perl一共有5种循环块,for,foreach,while,until以及裸块
      Last 操作符
      last操作符能立即终止循环的执行,类似于c语言中的break操作符 last操作符只会对当前运行的最内层
      的循环块发挥作用。
      next操作符
      next操作符用来挑到当前循环块的底端。结束当前这次循环迭代,在next之后,程序将会继续执行循环
      的下一次迭代。 类似于c语言里的continue.
      redo操作符
      redo能将控制返回到当前循环块的顶端,而不经过任何条件测试,也不会进入下一次循环迭代. next和
      redo的区别,next会正常继续下一次迭代,而redo则会重新执行这次的迭代
      带标签的块
      当需要从内层到外层的循环块进行控制时,可以使用标签。标签没有前置符号,建议名称全大写,如果
      要对循环块加上标签,通常只要将标签及一个冒号放在循环前面就可以了。 标签用来命名整块代码,而
      不是用来标明程序中的某个具体位置。标签并不是goto语句。
      条件操作符
      条件操作符类似一个if-then-else控制结构,由于使用时需要三个操作数,所以有时也成为三目操作符。

      Perl执行条件表达式,如果为真,就执行冒号前面的表达式,如果为假就执行冒号后的表达式。每次使
      用都会执行问号右边两个表达式中的一个,另一个则会被跳过,若条件表达式为真,则第二个表达式会
      被求值并返回,而忽略第三个表达式,若条件为假,则忽略第二个表达式,而对第三个表达式求值并返回,类似于 and or中的短路逻辑。
      任何使用?:操作符的表达式都可以改写成if结构
      逻辑操作符
      AND(与) &&  x&&y
      OR(或) ||   x||y
      逻辑与操作符,如果左边的表达式为假,整个表达式就不可能为真,因此不会对右边的表达式求值
      逻辑或操作符,如果左边的表达式为真,则整个表达式返回真,不用对右边的表达式求值。
      短路操作符的值
      Perl的短路操作符求得的值不仅是简单的布尔值,而是最后运算的那部分表达式的值,常常利用逻辑或
      操作符提供变量的默认取值
      定义或操作符
      利用或操作符提供变量的默认值,没有考虑到特殊情况,就是已定义的假值也可能被意外地替换为默认
      值。比如定义变量值为0,会被认为是假值。
      定义或操作符(//),在发现左边的值属于已定义时进行短路操作,而不管该值属于逻辑真还是逻辑假
      使用部分求值操作符的控制结构
      &&,||,//,?: 都是根据左边的值来决定是否计算右边的表达式,有些情况下会执行的表达式在另外的情况
      下并不执行,因此这些操作符有时被称为部分求值操作符,部分求值操作符是天然的的控制结构。

    • 计算机常用的存储单位

      2015-01-08 20:42:54

      8 bit = 1 Byte 一字节
      1024 B = 1 KB (KiloByte) 千字节
      1024 KB = 1 MB (MegaByte) 兆字节
      1024 MB = 1 GB (GigaByte) 吉字节
      1024 GB = 1 TB (TeraByte) 太字节
      1024 TB = 1 PB (PetaByte) 拍字节
      1024 PB = 1 EB (ExaByte) 艾字节
      1024 EB = 1 ZB (ZetaByte) 皆字节
      1024 ZB = 1 YB (YottaByte) 佑字节
      1024 YB = 1 NB (NonaByte) 诺字节
      1024 NB = 1 DB (DoggaByte)刀字节
    • Perl-哈希

      2015-01-07 07:11:06

      哈希是一种数据结构,和数组的相似之处在于可以容纳任意多的值并能按需取用。而它和数组的不同在
      于索引方式,数组是以数字来索引,哈希则以名字来索引。哈希的索引值,称为键,并不是数字,而是
      任意唯一字符串。哈希的键是字符串,而且可以是任意的字符串,但是必须是唯一的字符串。哈希里没
      有顺序,因此也没有所谓的第一个元素,有的只是一堆键值对的集合。键和值都是任意的标量,但键总
      会被转换成字符串。哈希可以是任意大小的,空哈希到填满内存的巨大哈希,没有大小限制。虽然哈希
      的键是唯一的,但它们对应的值是可以重复的,哈希的值可以是数字,字符串,undef,或是这些类型的
      组合,但哈希的键必须全部是唯一的字符串。
      为什么使用哈希?
      需要将一组数据对应到另一组数据。可以将哈希当成极其简单的数据库,其中每个键的名下都只能存储
      一块相应的数据,只要问题中带有找出重复,唯一,交叉引用,查表之类的字眼,就可能需要使用哈希。
      访问哈希元素
      $hash{$some_key} 使用花括号来表示索引值(数组使用方括号[]),并且键表达式是字符串而非数字。
      哈希的键可以是任意的表达式,若对某个已存在的哈希元素赋值,就会覆盖之前的值。哈希元素也会因
      赋值而诞生。访问哈希表里不存在的值会得到undef.
      访问整个哈希
      访问整个哈希,可以用百分号作为前缀(%).
      哈希可以被转换成列表,反之,列表页可以被转换为哈希。对哈希赋值等同于在列表上下文中赋值,列
      表中的元素应该为键值对,列表必须有偶数个元素。哈希转换成列表后,即使不知道某个键会出现在列
      表的哪个位置,仍然可以确信相应的值会跟在键后面。
      哈希赋值
      my %new_hash=%old_hash
      建立反序哈希
      my %inverse_hash=reverse %any_hash
      首先展开为键值对列表(key,value,key,value,key,value) 然后利用reverse的列表翻转功能形成
      (value,key,value,key,value,key)的新列表。
      如果哈希值中存在重复,则列表中最后的键会覆盖之前的键,因为哈希没有顺序,所以哪个值会被覆盖
      是不可预知的,最后是在键值对唯一的情况下使用哈希反转。
      胖箭头=>
      在Perl中,胖箭头只是逗号的另一种写法,也就是说,任何需要逗号的地方都可以用胖箭头来替代,但
      是主要是用在哈希中,比较容易区分键和值。使用胖箭头的时候可以省略键的引号,左边的部分会被自
      动引起。 如果键的内容看起来像Perl的操作符的话,最好引起来。在花括号中检索特定键名的时候也可
      以省略键名的引号。如果花括号内部是裸字,Perl就会将其当作表达式先求值,然后把结果当作键。
      裸字: 
      无需引号的字符序列称为裸字。                                                                
      哈希函数
      keys和values函数
      在列表上下文中,keys函数返回哈希的键列表,values函数返回对应的值列表。如果哈希没有任何成员
      ,则两个函数都返回空列表。只要在使用这两个函数时不修改哈希, 这两个函数返回的键列表和值列表
      的顺序是一致的。在标量上下文中,这两个函数都会返回哈希中元素(键值对)的个数。      
      each函数 
      each函数用来迭代整个哈希,它以包含两个元素的列表的形式返回键值对,每次对同一个哈希调用此函
      数,它就会返回下一组键值对,直到所有的元素都被访问过,在没有任何新的键值对,each会返回空列
      表。列表赋值在标量上下文中的求值结果为列表元素的个数,如果哈希返回键值对,则得到2,如果哈希返回
      键值对为空列表,keyi, value 会得到under, 列   表的元素个数为0,                             
      exist函数
      检查哈希中是否存在某个键,可以使用exist函数,它能返回真或假,分别表示键存在与否,和键对应的
      值无关。  
      delete 函数
      delete函数能从哈希中删除指定的键及其对应的值,假如没有这样的键,它就会直接结束,而不会出现
      任何警告或错误信息。   
      哈希元素内插
      可以将单一哈希元素内插到双引号引起的字符串中。但这种方式不支持内插整个哈希。
      %ENV哈希
      %ENV哈希对应环境变量的键值对。                                                              

                                                                                                  

                                                                                                  

                                                                                               
    • perl-输入与输出

      2015-01-05 07:38:53

      读取标准输入
      在标量上下文中执行该操作时,将会返回标准输入中的下一行,如果读到文件结尾,行输入操作符就会返回undef,这样的设计是为了配合循环使用,可以自然跳出循环。如果在列表上下文中调用行输入操作符,它就会返回一个列表,其中包含所有的输入内容,每个列表元素代表一行输入内容。
      钻石操作符
      它能让程序在处理调用参数时,提供类似于Unix 工具程序的功能。 
      程序的调用参数通常是命令行上跟在程序名后面的几个单词。若不提供任何调用参数,程序会从标准输入流采集数据。如果把连字符(-)当作参数,则表示要从标准输入读取数据,让程序以这种方式运行的好处就是你可以在运行时指定程序的输入源。
      钻石操作符是行输入操作符的特例,不过它并不是从键盘取得输入,而是从用户指定的位置读取。
      钻石操作符只有在碰到所有输入的结尾时才会返回undef.
      当前正在处理的文件名会被保存在特殊变量$ARGV中,如果当前是从标准输入获取数据,那么当前文件名就是"-"连字符
      钻石操作符的参数是来自@ARGV数组,这个数组是Perl解释器事先建立的特殊数组,其内容就是由命令行参数组成的列表。在程序开始运行前,@ARGV里就已经塞满了调用参数。         
      钻石操作符会查看数组@ARGV,然后决定该用哪些文件名,如果它找到的是空列表,就会改用标准输入流,否则,就会使用@ARGV里 的文件列表。
      输出到标准输出
      print操作符会读取后续列表中的所有元素,并把每一项一次送入到标准输出,它在每一项之前,之后与之间都不会再加上额外的字符。
      print @array 会把数组的元素打印出来,不加空格
      print "@array" 打印一个字符串,包含@array的所有元素,但元素以空格分开
      一般情况下,程序的输出结果会先被送到缓冲区,不会每当有一点点输出就直接送出去,而是先积攒起来,直到数量多时才造访外部设备。
      由于print处理的是待打印的字符串列表,因此它的参数会在列表上下文中被执行,而钻石操作符在列表上下文中会返回由许多输入行组成的列表,他们可以配合工作。
      printf操作符用来格式化输出,他的参数包括格式字符串及腰输出的数据列表。格式字符串里可以有多个所谓的转换,每种转换都会以百分比符号(%)开头,然后以某个字母结尾。后面的列表里元素的个数应该和转换的数目一样多,如果数目不对,就无法正确运行。
      要输出恰当的数字形式,可以使用%g,它会按需要自动选择浮点数,整数甚至是指数形式。
      %d 格式代表十进制整数,它会舍去小数点后面的数字。无条件截断。
      %s 代表字符串格式,它的功能实际上就是字符串内插,但是它还能设定字段宽度。如果宽度字段是负数,则会向左对齐。
      %f 转换格式会按需要四舍五入。可以指定小数点后的输出位数。
      要输出真正的百分号,使用%%.                                                                 文件句柄
      文件句柄就是程序里代表Perl进程与外界之间的I/O联系的名称,他是这种联系的名称,不是文件的名称。建议使用全大写字母来命名文件句柄。
      6个特殊文件句柄是Perl保留的,STDIN,STDOUT,STDERR,DATA,ARGV,ARGVOUT 
      Perl提供的默认文件句柄在使用时由产生Perl进程的父进程自动打开文件或设备,如果你需要其他文件句柄时,需要用open操作符告诉Perl.
      open CONFIG,'<','file';
      open CONFIG,'>','file';
      open CONFIG,'>>','file';
      以三个参数打开文件句柄比较容易区分模式(第二个参数)与文件名本身(第三个参数),在安全性方面也有好处,同时有机会指定数据的编码方式。
      open CONFIG,'>:encoding(UTF-8)','file';
      open CONFIG, '<:encoding(UTF-8)','file';
      open CONFIG,'>>:encoding(UTF-8)','file';   
      有问题的文件句柄
      如果试着从有问题的文件句柄(即没有正确打开的文件句柄或关闭的网络连接)读取数据,会立刻读到文件结尾(文件结尾在标量上下文中是undef,在列表上下文中则是空列表),如果试图将数据写入到有问题的文件句柄,这些
      数据将被丢弃。可以通过open的返回值来判断执行结果成功与否。
      当不需要某个文件句柄时,可以使用close操作符来关闭它。所谓关闭文件句柄,就是让Perl通知操作系统,我们对该数据流的处理已经全部完成,请系统将尚未写入的输出数据写到磁盘。当重新打开某个文件句柄时,Perl会
      自动关闭原先的文件句柄,在程序结束时,Perl也会自动关闭文件句柄。
      用die函数处理致命错误
      die函数会输出你指定的信息到专为这类信息准备的标准错误流中,并且让你的程序立刻终止并返回不为零的退出码。die函数会自动将Perl程序名和行号附加在错误信息的后面,因此可以轻易判断出程序里的哪个die函数才是造成程序过早结束运行的原因。
      用warn函数送出警告信息
      warn函数的功能是产生警告信息,它不会终止程序的运行。
      自动检测致命错误
      autodie, autodie是编译指令,靠判断具体操作的类型来工作,如果Perl内置函数的幕后操作需要调用系统接口的话,中途出现的错误并不是编程人员所能控制的,所以一旦发现这部分系统调用出错,autodie会自动帮你调用die。
      使用文件句柄
      以写入或添加模式打开的文件句柄可以在print或printf函数中使用,使用时,可以直接将他放在函数名之后,参数列表之前。文件句柄和输出的内容之间没有逗号。       
      $! Perl特殊变量,可读的系统错误信息。      
      改变默认的文件句柄
      可以用select改变默认的文件句柄。
      将数据输出到文件句柄时,默认情况下都会经过缓冲处理,将$|设定为1,就会是当前的默认句柄在每次进行操作后立即刷新缓冲区    
      重新打开标准文件句柄
      错误信息不一定都要送到程序的标准错误输出流,也可以送到文件里
      在重新打开三个系统文件句柄STDIN,STDOUT或STDERR失败时,Perl会帮你找回原来的句柄,Perl只有在成功打开新的句柄连接时才会关闭默认的系统文件句柄。
      用Say来输出
      Say的功能和print函数差不多,但在打印每行内容时会自动加上换行符。
      标量变量中的文件句柄
      可以将文件句柄放到标量变量中,成为标量变量后,文件句柄就可以作为子程序的参数传递,或者放在数组,哈希中排序,或者严格控制它的作用域。                                                                                 

                                                                                                                                                                                                            

                                                                                                                                                                                                            

           
    • 结束当前正在运行的命令

      2015-01-04 22:01:16

      ctrl+c
    • Linux删除文件夹命令

      2015-01-04 21:51:11

      linux删除目录
      rmdir
      目录非空 使用rm -rf命令即可。
      即:rm -rf 目录名字
      -r 就是向下递归,不管有多少级目录,一并删除
      -f 就是直接强行删除,不作任何提示的意思

      删除文件夹实例:
      rm -rf /var/log/httpd/access
      将会删除/var/log/httpd/access目录以及其下所有文件、文件夹

      删除文件使用实例:
      rm -f /var/log/httpd/access.log
      将会强制删除/var/log/httpd/access.log这个文件
    • Perl-子程序

      2015-01-04 06:59:30

      定义子程序
      定义子程序,用关键字sub,子程序名以及用花括号封起来的代码块。
      子程序总是由用户定义的,而函数则不一定。
      子程序可以被定义在程序中的任意位置,不需要对子程序进行事先声明
      子程序的定义是全局的
      如果定义了两个同名的子程序,后面的子程序会覆盖掉前面的那个。
      在子程序中可以使用任何全局变量。
      可以在任意表达式中使用子程序名(加上与号)来调用子程序。
      在Perl中,所有的子程序都有一个返回值,子程序并没有有返回值或没有返回值之分,但并不是所有的Perl子程序都包含有用的返回值。
      在子程序的执行过程中,它会不断进行运算,最后一次运算的结果都会被自动当程子程序的返回值。
      Perl子程序可以有参数,要传递参数列表到子程序里,只要在子程序调用的后面加上被括号圈因的列表表达式就可以了。参数列表将会被传入子程序,让子程序随意使用。Perl会自动将参数列表化名为特殊的数组变量@_该变量在子程序执行期间有效。子程序可以访问这个数组,以判断参数的个数以及参数的值。@_变量是子程序的私有变量 假如已经有了全局变量@_,则该变量在子程序调用前会被先存起来,并在子程序返回时恢复原本的值。子程序可以将参数传给其他程序,而不用担心遗失自己的@_.
      私有变量
      默认情况下,Perl里面所有的变量都是全局变量,程序的任何地方都可以访问他们,可以借助my操作符来创建私有变量。称之为词法变量。私有变量语句块外的变量完全不受私有变量的影响,外部变量也不受私有变量的影响
      子程序可以接受固定长度的参数列表,也可以通过改进接受变长参数列表和空参数列表。
      词法变量(my)可使用在任何语句块内,而不仅限于子程序的语句块。 
      my 操作符不加括号时,只能用来声明 单个词法变量。
      编译指令
      所谓编译指令不过是提供给编译器的某些指示,告诉它如何处理接下来的代码。
      use strict编译指令是要告诉Perl内部的编译器接下来的代码应该稍加严谨一点,遵循一些优良的变成风格。可以将use strict这个编译指令放在程序开头(或者任何需要强制使用约束规则的语句块或文件内) 从Perl 5.12开始,如果使用编译指令制定最低Perl版本的话,就相当于隐式打开约束指令。
      return操作符
      return会立即停止执行并从子程序内返回某个值,而不再执行子程序的其余部分。      
      在调用子程序时何时可以省略与号?
      如果编译器在调用子程序前看到过子程序的定义,或者Perl通过语法规则判断它只能是子程序调用,那么对待该子程序就可以像内置函数一样,在调用时省略与号。只能在没有同名内置函数的情况下省略与号。
      子程序的返回值
      子程序不仅可以返回标量值,如果你在列表上下文中调用它,他还能返回列表值。
      单写一个return不给任何参数时,在标量上下文中的返回值为undef,在列表上下文的返回空列表。通常用于表示子程序执行有误,它告诉调用者无法取得有意义的返回值。
      持久性私有变量
      使用state操作符来声明变量,可以在子程序的多次调用期间保留变量之前的值,并将变量的作用域局限于子程序内部。 在第一次调用子程序时,Perl声明并初始化持久性私有变量,而在接下来的调用中,这个初始化的表达式将被Perl忽略。每次子程序返回时,Perl都会将持久化私有变量的当前值保留下来,以备下次调用时使用。
      类似标量变量,任意类型的变量都可以被声明为state变量。                      
    • Shell-Shell入门

      2015-01-03 20:52:33

      脚本编程语言与编译型语言的差异
      编译形语言写成的程序只要从源代码转换成目标代码便能直接通过计算机来执行。
      编译型语言的好处是高效,缺点是他们多半运作与底层,所处理的是字节,整数,浮点数或是其他机器层级的对象。
      脚本编程语言通常是解释型的,这类程序的执行,是有解释器读入程序代码,并将其转换成内部的形式,再执行,解释器本身是一般的编译型程序。使用脚本编程语言的好处是他们多半运行在比编译型语言还高的层级,能够轻易处理文件与目录之类的对象,缺点是,他们的效率通常不如编译型语言。
      为什么使用shell脚本 
      简单性,Shell是一个高级语言,通过它,你可以简洁地表达复杂的操作
      可移植性,使用POSIX所定义的功能,可以做到脚本无须修改就可以在不同的系统上执行
      开发容易,可以在短时间内完成一个功能强大又好用的脚本。
      who  查看现在系统有谁登陆
      wc程序,字数计算程序,它可以算出行数,字数与字符数,
      |管道符号可以在两程序之间建立管道,
      Who的输出,成了wc的输入,wc所列出的结果就是已登陆用户的个数。
      who | wc -l
      下一步就是将此管道转变成一个独立的命令,方法是把这条命令输入一个一般的文件中,然后使用chmod为该文件设置执行的权限。
      小型shell脚本典型开发周期,
      首先,直接在命令行上测试,
      然后,一旦找到能够完成工作的适当语法,
      再将它放进一个独立的脚本里,并为该脚本设置执行的权限,
      之后,就能直接使用该脚本。
      当shell执行一个程序时,会要求UNIX内核启动一个新的进程,以便在该进程里执行所指定的程序。当Shell要求内核执行它时,内核将无法做这件事,并回应not executable format file的错误信息,Shell收到此错误信息时,会启动一个新的/bin/sh(标准shell)副本来执行该程序。
      如果UNIX系统有多个Shell,如何告知UNIX内核应该以哪个Shell来执行所指定的Shell脚本?
      通过脚本文件中特殊的第一行来处理,在第一行的开头处使用#!这个字符。当一个文件中开头的两个字符是#!时,内核会扫描该行其余的部分,看是否存在可用来执行程序的解释器的完整路径。中间出现任何空白符号都会略过。此外,内核还会扫描是否有一个选项要传递给解释器,内核会以被指定的选项来引用解释器,再搭配命令行的其他部分。Shell脚本通常一开始都是#! /bin/sh
      对#!这一行的长度尽量不要超过64个字符
      脚本是否具有可移植性取决于是否有完整的路径名称
      别在选项后面放任何空白,因为空白也会跟着选项一起传递给被引用的程序
      你需要知道解释器的完整路径名称

      UNIX命令行的原理
      1 格式简单,以空白(space键或Tab键)隔开命令行中各个组成部分
      2 命令名称是命令行的第一个项目通常后面会跟着选项,任何额外的参数都会放在选项后面
      3 选项的开头是一个破折号(或减号),后面接着一个字母,选项是可有可无的,有可能需要加上参数,不需要参数的选项可以合并,选项有短选项和长选项 
      4 分号(;)用来分隔同一行里的多条命令,Shell会依次执行这些命令。如果使用的是&符号而不是分号,则Shell将在后台执行其前面的命令,意味着Shell不用等到该命令完成,就可以继续执行下一个命令。

      Shell识别三种基本命令,内建命令,Shell函数以及外部命令
      1内建命令就是由Shell本身所执行的命令。有些命令是由于其必要性才内建的,有一些内建命令是为了效率
      2 Shell函数是功能健全的一系列程序代码,以Shell语言写成,他们可以像命令那样引用。
      3 外部命令就是Shell的副本(新的进程)=所执行的命令,基本的过程如下:
        1 建立一个新的进程,此进程即为Shell的一个副本
        2 在新的进程里,在PATH变量内所列出的目录中,寻找特定的命令,当命令名称中含有斜杠/符号时,将略过路径查找步骤
        3 在新的进程里,以所找到的新程序取代执行中的Shell程序并执行
        4 程序完成后,最初的Shell会接着从终端读取的下一条命令,或执行脚本里的下一条命令。
      Shell变量赋值的方式为,先写变量名称,紧接着=字符,最后是新值,中间没有空格,当想取出Shell变量的值时,在变量名称前面加上$字符,当所赋予的值内含空格时,请加上引号。单行可进行多次赋值。
      当变量作为第二个变量的新值时,不需要使用双引号,但是用双引号也没有关系。但是当你将几个变量连接起来时,必须使用双引号。
      echo 的任务就是产生输出,可用来提示用户,或是用来产生数据供进一步处理,原始的echo命令只会将参数打印到标准输出,参数之间以一个空格隔开,并以换行符好结尾。
      printf 命令可以输出简单的字符串,printf不像echo那样会自动提供一个换行符,必须显式地将换行符执行为\n

      程序应该有数据的来源端,数据的目的端,以及报告问题的地方,他们分别被称为标准输入,标准输出以及标准错误输出。许多UNIX程序默认情况下会读取标准输入,写入标准输出,并将错误信息传递到标准错误输出,这类程序叫做过滤器。
      在你登录时,UNIX便将默认的标准输入,输出及错误输出安排成你的终端,
      IO重定向就是你通过与终端交互,或是在Shell脚本里设置,重新安排从哪里输入或输出到哪里。

      重定向与管道
      1 以<改变标准输入
      2 以>改变标准输出  >重定向符在目的文件不存在时,会新建一个,然而,如果目的文件已存在,他就会被覆盖掉,原本的数据都会丢失。
      3 以>>附加到文件 如同>,如果目的文件不存在,>>重定向符就会新建一个,然而,如果目的文件存在,它就不会直接覆盖掉文件,而是将程序所产生的数据附加到文件结尾处。
      4 以 |建立管道。管道可以把两个以上执行中的程序衔接在一起,第一个程序的标准输出可以变为第二个程序的标准输入,管道可以使得执行速度比使用临时文件的程序快上十倍,构造管道时,应该试着让每个阶段的数据量变得更少,如果有两个要完成的步骤与先后次序无关,可以让数据变少的那一个步骤放在管道的前面,这样可以提升脚本的整体性能,因为Unix只需要在两个程序间移动少的数据量。
      特殊文件 
      /dev/null ,也叫位桶,传送到此文件的数据都会被系统丢掉,当程序将数据写到此文件时,会认为它已经成功完成写入数据的操作,但实际上什么也没有做。读取/dev/null会立即返回文件结束符号。
      /dev/tty,当程序打开此文件时,UNIX会自动将它重定向到一个终端再与程序结合在程序必须读取人工输入时特别有用,用它来产生错误信息也很方便
      $PATH是一个以冒号分隔的目录列表,你可以在列表所指定的目录下找到所要执行的命令,所找到的命令可能是变异后的可执行文件,也可能是Shell脚本。
      可以建立自己的bin目录并驾到$PATH中,要让修改永久生效,在.profile文件中把bin目录加入$PATH,每次登陆时Shell都会读取.profile文件
      $PATH里的空项目表示当前目录,空项目位于路径值中间时,可以用两个连续的冒号来表示,如果将冒号直接置于最前端或最后段,可以表示查找时最先查找或最后查找当前目录。
      位置参数指的就是Shell脚本的命令行参数。他们同时也可以是函数的参数,各参数都有整数来命名。
      执行跟踪, 用set -x 命令将执行跟踪的功能打开,用set +x命令关闭它
    • Shell-设计与开发软件工具的原则

      2015-01-02 20:59:38

      设计与开发软件工具的原则,好的软件工具应该具备下列特点
      1 一次做好一件事
      2 处理文本行,不要处理二进制数据
      3 使用正则表达式
      4默认使用标准输入/输出
      5 避免喋喋不休
      6 输出格式必须与可接受的输入格式一致
      7让工具去做困难的部分
      8 构建特定工具前,先想想
    • Perl-列表与数组

      2015-01-02 20:12:39

      Perl 标量代表的是单数,列表和数组代表的是复数
      列表指的是标量的有序集合,而数组则是存储列表的变量。列表指的是数据,数组指的是变量。
      列表的值不一定要放在数组里,但每个数组变量都一定包含一个列表。
      数组或列表中的每个元素都是单独的标量变量,拥有独立的标量值,这些值是有序的。从起始元素到终
      止元素的先后次序是固定的。数组或列表中的每个元素都有相应的整数作为索引,从0开始,每次加1
      列表或数组中每个元素都是独立不相关的标量值,所以列表或数组中可能包含数字,字符串,undef值或
      不同类型标量值得混合。数组或列表可以包含任意多个元素,最少的情况是没有任何元素,最多的情况则是把可用的内存全部塞满。
      数组的名字空间和标量的名字空间完全分开,可以在同一个程序中取$x和@x.
      如果对索引值超过数组尾端的元素进行赋值,数组将会根据需要自动扩大。
      数组中最后一个元素的索引值为$@X.
      ..范围操作符,该操作符会从左边的数字技术到右边,每次加1。
      qw 表示quoted word,加上引号的单词,Perl将其当成单引号内的字符串来处理,在qw构建的列表中,不
      能像双引号内的字符串一样使用\n或@X.不能将注释放在qw列表中。Perl允许用任何标点符号作为qw的定
      界符,如果起始定界符是某种左字符,那么结尾定界符必须是对应的右字符。可以使用\在qw中进行转义。
      对列表进行赋值时,多出来的值挥别忽略掉,如果变量的个数多过给定的列表值得个数,多出来的变量
      会被设为undef.
      可以用@引用整个数组。
      pop负责取出数组中最后一个元素并将其作为返回值返回。pop常用来删除数组中的最后一个元素。如果
      数组是空的,pop什么也不做,直接返回undef.
      Push用于添加一个元素或是一串元素到数组的尾端。
      Push的第一个参数和pop的唯一参数都必须是要操作的数组变量。
      shift 负责取出数组中第一个元素并将其作为返回值返回,shift可以删除数组中的第一个元素。如果过
      是空数组,shift直接返回undef.
      unshift用于添加一个元素用于添加一个元素或一串元素到数组的开始。
      Splice用来添加或移除数组中间的某些元素,最多可接受4个参数,最后两个是可选参数,第一个参数是
      要操作的目标数组,第二个参数是要操作的一组元素的开始位置,第三个参数指定要操作的元素长度,
      第四个参数是要替换的列表。如果没有后两个参数,则从给定位置开始一直到数组末尾的全部元素取出
      来并返回。第四个参数用来替换或补充新元素到数组中。当第三个元素为0时,可以直接添加新元素给列
      表。

      数组的内容可以被内插到双引号中,内插时,会在数组的各个元素之间自动添加分隔用的空格。数组被
      内插时,首位都不会添额外空格。内插数组中的某个元素时,会被替换成该元素的值。
      foreach循环能逐项遍历列表中的值,依次迭代。foreach中控制变量并不是列表元素的复制品,实际上
      是列表元素本身,如果循环中修改了控制变量的值,就同时修改了这个列表元素。循环结束后,控制变
      量会恢复为循环执行之前的值。
      $_ 默认变量
      reserve 读取列表的值并按相反的次序返回该列表,但它并不会修改传进来的参数。
      Perl总是会先计算等号右边要赋的值,再实际进行复制操作。
      Sort读取列表的值,根据内部的字符编码顺序对他们进行排序。
      each 对数组调用each,会返回数组中下一个元素所对应的两个值,该元素的索引和该元素的值。
      标量上下文和列表上下文
      同一个表达式出现在不同的地方会有不同的意义。可以使用伪函数scalar强制切换到标量上下文。
      在标量上下文中会返回输入数据的下一行,在列表上下文中,则会返回所有剩下的行,直到文件结尾为止。
      发送文件结尾标记
      Unix Control+D
      DOS/Windows Control +Z
      chomp 会去掉所有的换行符。

    • 各硬件设备在Linux中的文件名

      2014-12-31 22:57:38

      在Linux系统中,每个设备都被当成一个文件来对待。

          

      设备在Linux内的文件名

      IDE硬盘

      /dev/hd[a-d]

      SCSI/SATA/USB硬盘

      /dev/sd[a-p]

      U

      /dev/sd[a-p](与SATA相同)

      软驱

      /dev/fd[0-1]

      打印机

      25:/dev/lp[0-2]
      USB:/dev/usb/lp[0-15]

      鼠标

      USB:/dev/usb/mouse[0-15]
      PS2:/dev/psaux

      当前CD ROM/DVD ROM

      /dev/cdrom

      当前鼠标

      /dev/mouse

      磁带机

      IDE:/dev/ht0
      SCSI:/dev/st0

      如果磁盘驱动器的磁盘分区不同时,磁盘文件名还会改变
    • Perl-标量数据

      2014-12-31 22:51:42

      标量
      Perl用标量(Scalar)来称呼单个事物,标量是Perl里面最简单的一种数据类型。对于大部分标量来说,他们要么是数字,要么是字符组成的序列。
      可以用操作符对标量进行操作,产生的结果通常也是一个标量,标量可以存储在标量变量里,也可以从文件和设备读取或写入。
      数字
      对于整数或浮点数,在Perl内部都是按双精度浮点数的要求来保存数字并进行运算的。也就是说,Perl内部并不存在整数值,程序中用到的整型常量会被转换成等效的浮点数值。
      字符串
      单引号字符串直接量和双引号字符串直接量的区别就是双引号中反斜线更为强大,可以转义许多控制字符或用八进制或十六进制写法来表示任何字符。
      字符串可以用.操作符进行连接操作
      字符串重复操作符 x  重复操作符做操作数是字符串类型,右操作数为重复次数,使用前先取整,重复次数小于1时会生成长度为零的空字符串.
      数字和字符串之间在操作时会自动转换,对数字进行运算的操作符,如果遇到字符串类型的操作数,Perl会将字符串转换成等效的十进制浮点数进行运算,如果字符串操作符遇到数字时,数字会被转换为形式相同的字符串。

      标量变量
      Perl的标量变量是区分大小写的,使用$定义标量变量,Perl使用等号作为赋值运算符
      标量变量内插
      把字符串内出现的所有标量变量替换成该变量当前的值,字符串必须用双引号。
      比较运算符
      比较                           数字                       字符串
      相等                          ==                         eq
      不等                          !=                        ne
      小于                           <                           lt
      大于                           >                           gt
      小于或等于                <=                         le
      大于或等于                 >=                        ge
      布尔值
      如果是数字,0为假,所有其他数字都为真
      如果是字符串,空字符串为假,所有其他字符串都为真。
      如果既不是数字也不是字符串,那就先转换成数字或字符串再判断
      字符串'0'跟数字0 是同一个标量值,字符串'0'是唯一被当成假的非空字符串
      获取用户输入
      行输入操作符
      chomp 操作符
      如果字符串末尾是换行符,去掉换行符
      undef 值
      如果变量没有被定义,初始值为undef, 如果是数字,underf为0,如果是字符串,undef为空字符串
      defined 函数
      判断字符串是undef还是空字符串,如果是undef defined 返回假,如果是空字符串,返回真
    431/3123>
Open Toolbar