• perl 语法速查 | 模块安装


    perl -MCPAN -e shell
    

    install Bio::SeqIO

      

    或者直接perl -MCPAN -e 'install Excel::Writer::XLSX'

    用cpan装不上,编译有问题,尝试用conda,成功安装。

    conda install -c bioconda perl-bioperl  

     然后还需要导出perllib,让perl能找到指定的pm包。

    同时学perl、python和shell脚本会很容易将它们的语法搞混,本文主要是一个个人的总结,方便要用时的查询。

    perl基本语法、安装、帮助文档


    文件头格式:

    #!/usr/bin/perl
    use strict;
    use warnings;

    运行perl脚本:

    #调用perl程序
    perl test.pl
    #可执行脚本
    chmod 755 test.pl
    ./test.pl

    基本读写:

    #键盘输入
    $a = <STDIN>;
    chomp($a);
    print $a;
    
    #文件输入
    open(IN, "<test.txt") or die "Cannot open file:$!
    ";
    open(OUT, ">test.txt") or die "Cannot open file:$!
    ";
    while(<IN>){
        chomp;
        print OUT "1. $_";
        last;
    };
    close(IN);
    close(OUT);

    基本控制流:

    if( ){
    
    }elsif( ){
    
    }else{
    
    }
    print "Hello!" if (1 == 1);  #简写
    while( ){
        $count++;
    }
    
    for($i; $i <= 10; $i++){
    
    }
    
    foreach (@array){
        print $_;
    }
    last;   #break
    next;   #continue

    数据结构:标量变量($),列表(),数组(@),哈希(%),文件句柄(<>)

    语法结构:语句以分号(;)结束,代码块使用花括号{}划分,动态语言不必指明变量类型

    单双引号:单引号q(),所有原样输出;双引号qq(),允许插入变量

    语法惯例:perl中很多地方括号()是可有可无的,特别是内置函数,如print、split等;可以使用递增递减运算符

    安装:Windows装Active版本,(perl -v)检查;linux装,

    $ tar -zxvf stable.tar.gz -C dir
    $ sh Configure   # 配置
    $ make   # 安装
    $ make test  #测试是否make成功
    $ make install

    帮助文档:perldoc命令

    perldoc  #会提示用法
    perldoc perl  #会显示详细用法
    perldoc perlfunc  #三大模块
    perldoc perlop
    perldoc perlfaq

    建议使用浏览器查看本地的HTML文档:

     

    查找索引


    正则表达式(/ /、$1、=~、!~);模式替换(=~ s/ /);模式匹配规则;修饰符i和全局匹配g;grep函数(搜索数组)

    键盘输入(<STDIN>, chomp);

    函数(split、length、join、map、grep)

    作用域(my、our、local)

    perl版本更新与多版本安装

    特殊变量

    $_:默认参数,就是当前的默认操作参数,在读文件<FILE>、迭代for (@array)、split / /、print中非常重要

    $!:标准错误输出,一般只与or die语句连用

    $1:正则表达式模式中第一个括号内的变量,如(.*)、(string),以此类推

    @_:sub函数传递的参数数组,

    字符串运算符

    连接字符串:并置运算符(.)

    转义:反斜杠

    区分标量和字符串:{}显示指定变量名,如${name}space

    重复运算符(x),如“-”x 10

    数组、哈希

    列表:列表是常量,由圆括号()创建,中间用逗号隔开

    # 范围运算符
    @a = (1..10)
    @b = (1..10, 21..30)
    @list=(aa..zz);

    创建数组:用列表()创建数组

    引用数组:用方括号[ ]下标引用数组

    创建哈希:用列表()创建哈希,为了好看,键值对以=>形式组织;也可以单个创建

    引用哈希:用花括号{}引用哈希

    数组操作

    @name = (1..10);
    @b = @name[2,4,6];
    print "my name is ";
    print "$#b";

    (数值/字符串)比较

    数字比较:(==、>、<、>=、<=、!=)

    字符串比较:(eq、gt、lt、ge、le、ne)

    print用法

    print:可以直接接变量$var、@array、%hash,输出的就是不带空格回车,将所有元素连在一起,数组一坨,哈希一坨,其中哈希顺序是乱的。

    print:可以带双引号,数组之间有空格,可以分辨了;哈希失效了,没有内容,就显示出%hash。

    print:输出到文件时,文件句柄在前,中间是空格(不能是逗号),后面是输出内容

    q()、qq()、qw()、qx{}

    q():用单引号将内容括起来

    qq():用双引号将内容括起来

    qw():用单引号将空格隔开的序列组装成数组,会屏蔽里面的标量

    # 两者等价,最好不要有内嵌变量
    @a = qw(abc def ghi)  
    @b = ('abc','def','ghi')

    qx{ }:捕获命令输出

    $directory = `dir`;
    $directory_2 = qx{dir};

    正则表达式、模式、替换、匹配规则、grep函数(完)


    元字符(简单元字符、转义字符、通配符、字符类、分组和选择、位置通配符)

    替换(s/ / /)

    修饰符 i 和 全局匹配 g

    用于识别输入流中的特定模式,一般是(/ /),m可以省略,$_是默认匹配对象,指定匹配对象用(=~),$1用于取出第一个括号内匹配

    #模式里可以有标量变量
    $name = "lizhixin";
    $surname = "li";
    print "yes, $1" if $name =~ /($surname)/;

    模式匹配用途有二:1.条件判断,用在if语句里;2.取出匹配上的模式,$1,对其进行操作。

    • 默认正则表达式是返回真假,可用于条件判断;
    • 如果加入括号(),就可以用$1、$2…访问相应模式,将()()()等赋值给数组;或者用/ /g赋值给数组,选出所有模式种类

    模式匹配规则:

    • 从左向右依次匹配
    • 找到一个匹配项就返回真
    • 尽可能多的寻找能够匹配的字符(不代表会全部输出,除非像下面一样指定,默认是输出第一个匹配上的
    #//g能够输出所有的匹配项
    $name = "lizhiixiii";
    @result = $name =~ /(i+)/g;
    print "@result";
    # i ii iii

    圆点(.):匹配除换行符外的所有单个字符;通常是(*.)连用,匹配所有;(.与其前面的字符无关,可出现在任意位置)

    $a="lizhiiiixin";
    print "$1" if $a =~ /(i.x)/; # iix
    (+):前面的字符要+(1~N次)(不能没有i,一个i是底线)(必须存在前面的字符
    $a="lizhiiiixin";
    print "$1" if $a =~ /(i+x)/; # iiiix
    (*):前面的字符要存在0次或多次(可以没有前面的i)(必须存在前面的字符
    $a="lizhiiiixin";
    print "$1
    " if $a =~ /(i*x)/; # iiiix
    print "$1
    " if $a =~ /(l*i)/; # li
    (?):前面的字符进行0次或一次匹配(必须存在前面的字符
    $a="l1zhhiixin";
    print "$1
    " if $a =~ /(hi?)/; # h
    {n, m} # n:匹配的最小次数;m:匹配的最大次数
    /x{5,10}/    #好理解
    /x{9,}/        #最少9次
    /x{0,4}/    #0次(不出现),最多9次
    /x{8}/        #刚好8次
    /first.*last/ #可以匹配所有字符,包括所有

    匹配方括号内中的任意字符(括号内的通配符^*等会失去原有的意义)

    [abcde]  #匹配其中任何一个字符
    [a-e]    #同上[0-9]+   #顺序匹配一个或多个数字
    [A-Za-z]{5} #匹配任何一组5个字母字符[^A-Z]   #不匹配A-Z中的任何单个字符
    字符类快捷方式
    w   #一个单词字符,同[a-zA-Z0-9_]
    W   #与w相反
    d   #一个数字,与[0-9]相同
    D   #与d相反
    s   #一个白空间字符,同[	f
    ]
    S   #与s相反
    # 使用字符类快捷方式dw+等
    $name = "li12345 zhi xin";
    print "$1
    " if $name =~ /(d{5})/;
    print "$1
    " if $name =~ /(sw+s)/;

    分组和选择(找任意一种模式,或)

    print "yes
    " if (/dogs|cats/);
    print "yes
    " if (/(fr|b|fl|cl)og/);
    ($one, $two) = /(.*)siss(.*)/;

    位置通配符

    /^Help/   #只匹配Help开头的行
    /^one.*two$/   #只匹配one开头和two结尾的行
    /^only$/   #只匹配包含only的行
    /^$/   #匹配空行
    /^/    #匹配非空行
    #不匹配
    if($a !~ /zi/){
        print "not match.
    ";
    }
    print "yes
    " if(m/Piglet/);  # 如果使用的是斜杠//,那么m可以省略
    $_="apple is red";
    ($fruit, $color) = /(.*)siss(.*)/;

    正则匹配可能会有多种可能的匹配位点,但有时只返回一种最合适的匹配结果,请问这个结果是如何选出来的?(核心问题)

    $a = "one fish, two frog, red fred, blue foul";
    @F = $a =~ /(fwww)/g;

    替换(返回匹配的数量)

    $a = "lizhizhixin";
    print "$a
    ";
    $a =~ s/zhi/xin/; #只替换第一个匹配到的模式
    print "$a
    ";

    修饰符(/ /i)与多次匹配(/ /g)

    $name = "LiZhixin";
    print "yes, $1" if $name =~ /(^li)/i;  # yes, Li
    $seq = "ATCTGCAATTTCCTA";
    $numA = 0;
    while ($seq =~ /T/g){
        $numA++;
    }
    print "$numA
    ";

    grep函数(搜索数组,返回匹配元素或者修改匹配元素,条件可以使正则表达式或是其他条件)

    @name = qw(li zhi xin);
    @result = grep(/^[^l]/, @name);
    print "@result";  # zhi xin
    @result = grep(s/i/o/, @name);
    print "@result";  # lo zho xon
    @result = grep(length($_)>2, @name);
    print "@result";  # zhi xin

    函数

    标准函数格式:

    常用内置函数

    split

    int(5.20);

    length(“nose”);

    lc(“ME TOO”);

    uc(“hal 9000”);

    cos(50);

    rand(5)

    堆栈操作函数

    push()

    pop()

    shift():将最后一个元素移走,常用语处理函数参数

    unshift()

    命令行

    上下文

    chomp

    chomp是运算符,可以用圆括号,也可以用空格;它会改变参数变量,其返回值是1或0

    $a = "lizhiixn
    ";
    print $a;
    print "next
    ";
    chomp $a;
    print $a;
    print "next";
    $b = chomp($a);  #极少这么用

    perl版本更新与多版本安装

    自己做服务器最好用Ubuntu,apt-get用着很方便,版本更新可以用系统自带的软件更新

    Linux没有注册表,软件安装相对独立,理论上所有软件都是绿色版,只是稍微需要配置环境变量和软链接

    或者安装多个版本,然後修改/usr/bin/perl的symbolic link到/usr/local/bin/perl,软连接的指向问题

    tar zxvf perl-5.10.0.tar.gz
    cd perl-5.10.0
    ./Configure -des -Dprefix=/usr/local/perl    # 参数-Dprefix指定安装目录为/usr/local/perl
    make
    make test
    make install
    mv /usr/bin/perl/ usr/bin/perl.bak   # 替换系统原有的perl
    ln -s /usr/local/perl/bin/perl/ usr/bin/perl
    perl –v
    
    perl -MCPAN-e shell  # 安装一些其它perl模块
    #第一次执行的话,会提示安装cpan并要求连接网络下载最新的模块列表.然后就可以安装东西了
    cpan> install DBI
  • 相关阅读:
    thinkphp中插入ueditor编辑器的代码
    编辑器
    php中上传图片,原生代码
    thinkphp中上传图片以及制成缩略图
    https://www.oschina.net/project/lang/19/java
    js中各种弹窗
    MYSQL数据库中中文乱码问题
    关于对CSS中超链接那部分的设置
    Collectors.groupingBy应用
    定时器算法
  • 原文地址:https://www.cnblogs.com/leezx/p/5755237.html
Copyright © 2020-2023  润新知