• Perl语言入门1013


    ----------第十章 其他控制结构----------------

    unless结构

    unless($fred =~ /\A[A-Z_\w*\z]/i){print "yes";}
    #等同
    if(!($fred =~ /\A[A-Z_\w*\z]/i)){print "yes";}
    if($fred =~ /\A[A-Z_\w*\z]/i){}else{print "yes";}
    

    until结构

    while的相反,条件为假时重复执行。

    表达式简化

    print "$n is a negative number.\n" if $n <0;
    &error("invalid input") unless &valid($input);
    
    print " ",($n += 2) while $n <10;
    $i *= 2 until $i >$j;
    
    &greet($_) foreach @person;
    

    裸块

    去掉条件表达式的代码块,并非循环,仅执行一次。

    {
        print "please enter a number: ";
        chomp(my $n = <STDIN>);
        my $root = sqrt $n; #限于此块的临时变量
        print "the aquare root of $n is $root\n";
    }
    

    elsif子句

    当条件太多时,会用switch/given-when等结构

    if(! defined $dino){
        print "undef\n";
    }elsif($dino =~ /^-?\d+\.?$/){
        print "integer\n";
    }elsif($dino =~ /^-?\d*\.\d+$/){
        print "floating point number\n";
    }elsif($dino eq ''){
        print "empty string\n";
    }else{
        print "string\n";
    }
    

    自增自减

    my $bedrock = 43;
    $bedrock++;
    $bedrock--;
    
    #如计算列表元素个数
    my @people = qw(fred bad fred bad dino fred);
    my %count;
    $count{$_}++ foreach(@people);
    
    #前置自增自减
    my $m = 5;
    my $n = ++$m; #m=n=6
    my $c = --$m; #m=c=5
    
    #后置自增自减
    my $m = 5;
    my $d = $m++; #d=5,m=6
    my $e = $m--; #e=6,m=5
    
    #如果不提取变量值,前置后置结果都一样
    $bedrock++;
    ++$bedrock;
    

    for结构

    for($i = 1; $i < 10 ; $i++){ #初始化,测试,递增三部分都可为空
        print "I can't count to $i\n";
    }
    
    • for和foreach
      若for条件中无分号,等同foreach
    for(1..10){print "$_\n";}
    foreach(1..10){print "$_\n";}
    

    循环控制

    #last 立即中止
    while(<STDIN>){
        if(/_END_/){
            last;  
        }elsif(/fred/){
            print;
        }
    }
    
    #next 结束当前循环 
    while(<>){
        foreach(split){ #将$_分解为单词,每个单词赋值给$_
            $total++;
            next if(\W); #非单词跳过,进行下次循环
            $valid++;
            $count{$_}++; #统计每个单词个数
        }
    }
    foreach $word (sort keys %count){
        print "$word was seen $count{$word} times.\n";
    }
    
    #redo 跳回循环内的第一句
    my @words = qw(one two three four);
    my $error = 0;
    foreach(@words){
        #redo会跳回这里,重来一遍
        print "word is $_";
        chomp(my $try = <STDIN>);
        if($try ne $_){
            print "sorry,error!\n";
            $error++;
            redo;
        }
    }
    
    

    三目操作符(条件操作符)?:

    my $mean = $n? ($total/$n): "------";
    print "mean is $mean\n";
    
    my $location = &is_weekend($day)? "home" : "work";
    
    #多分支
    my $size = 
        ($width <10) ? "small" :
        ($width <20) ? "medium" :
        ($width <50) ? "large" :
                        "extra-large"; #默认值
    

    逻辑操作符

    && ||
    if(($n != 0) && ($total/$n <5)) {print "$n\n";}
    
    #短路操作符
    my $name = $name{$someone} || 'no name'; #||左边为默认值
    

    使用部分求值操作符作为控制结构

    ($m < $n) && ($m = $n) #等于$m=$n if $m<$n
    ($m > 10) || print "this number less 10\n"; #或
    ($m < $n)? ($m = $x): ($n = $x)
    
    #也可用and/or
    $m < $n and $m = $n; #用if更好
    open my $fh, '<', $filename or die "can't open $filename: $!";
    
    #注意不要滥用  
    

    ---------第十一章 Perl模块 --------------

    寻找模块

    来源:Perl自带;CPAN
    检查系统是否已安装模块: perldoc CGI #perl自带的CGI.pm模块。
    列出所有已安装的模块:cpan -a

    安装模块

    一. 源码安装:
    #先下载打包发布的模块文件包,解压编译。
    #1.ExtUtils::MakeMaker封装的模块:
    perl Makefile.PL INSTALL_BASE=/my/path/
    make
    #make test
    make install
    
    #2.Module::Build辅助模块:
    perl Build.PL --install_base=/my/path/
    ./Build
    #./Build test
    ./Build install
    
    二. Perl自带CPAN.pm模块安装
    #需要联网和root权限
    perl -MCPAN -e shell
    进入CPAN.pm的shell中,使用相关命令:
    help(帮助); m(列出所有模块); install mypm(安装);quit(退出)
    
    #或
    cpan Module::CoreList LWP CGI::Prototype mypm
    
    #或
    cpan -i mypm
    

    非root安装模块

    1. local::lib模块来安装新模块  
    wget https://cpan.metacpan.org/authors/id/H/HA/HAARG/local-lib-2.000024.tar.gz
    tar xf local-lib-2.000024.tar.gz
    cd local-lib-2.000024
    perl Makefile.PL --bootstrap=/my/path
    make test && make install
    #设置环境变量:
    echo 'eval "$(perl -I/my/path/lib/perl5 -Mlocal::lib=/my/path)"' >> ~/.bashrc
    
    2. cpanm:私人的cpan下载器
    wget https://cpan.metacpan.org/authors/id/M/MI/MIYAGAWA/App-cpanminus-1.7043.tar.gz
    tar xf App-cpanminus-1.7043.tar.gz
    cd App-cpanminus-1.7043
    perl Makefile.PL
    make test && make install #安装在local::lib路径下
    
    #使用国内镜像:
    echo 'alias cpanm="cpanm --mirror http://mirrors.163.com/cpan --mirror-only"' >>~/.bashrc
    
    #以后只要用cpanm Module::Name就能安装任意模块了。如cpanm Acme::Python默认安装在同local::lib的路径下man/man3/
    

    使用简易模块

    1. File::Basename模块
      从文件全名中取出基名:
    use File::Basename;
    my $name = "/usr/local/bin/perl";
    my $basename = basename $name; #返回perl
    

    仅使用模块中的部分函数,避免有的函数与现有子程序名冲突。

    use File::Basename qw(basename);
    
    use File::Basename qw/ /; #不导入任何函数
    use File::Basename (); #同上
    
    my $betty = &dirname($wilm);#自定义的子程序&dirname
    my $name = "/usr/bin/perl";
    my $dirname = File::Basename::dirname $name; #模块中的dirname函数,/usr/bin
    
    1. File::Spec模块
      操作文件说明,文件名/目录名/文件系统中的其他名称。File::Spec模块是面向对象的(OO)。
    use File::Basename;
    use File::Spec;
    
    my $old = "/ldfssz1/SP_MSI/USER/pengjianxiang/Test/perl/test.txt";
    my $dirname = dirname $old;
    my $basename = basename $old;
    $basename =~ s/^/not/;
    
    my $new = File::Spec -> catfile($dirname,$basename); #->符号就是面向对象,后接方法名
    rename($old,$new) or warn "can't rename '$old' to '$new': $!";
    print "$old\n$new\n";
    
    #输出/ldfssz1/SP_MSI/USER/pengjianxiang/Test/perl/test.txt
    /ldfssz1/SP_MSI/USER/pengjianxiang/Test/perl/nottest.txt
    
    1. Path::Class模块
      更为友好的处理不同系统上的文件名规则
    #cpanm Path::Class #安装
    use Path::Class;
    my $dir = dir (qw(ldfssz1 SP_MSI USER pengjianxiang Test perl));
    my $subdir = $dir -> subdir('perltest'); #子目录
    my $parent = $dir -> parent; #父目录
    my $windir = $dir ->as_foreign('Win32'); #window系统
    print "$dir\n$subdir\n$parent\n$windir\n";
    
    #输出:
    ldfssz1/SP_MSI/USER/pengjianxiang/Test/perl
    ldfssz1/SP_MSI/USER/pengjianxiang/Test/perl/perltest
    ldfssz1/SP_MSI/USER/pengjianxiang/Test
    ldfssz1\SP_MSI\USER\pengjianxiang\Test\perl
    
    
    1. CGI.pm模块
      CGI(公共网关接口)定义了web服务器与外部内容生成程序之间交互的方法,通常是指CGI程序或者CGI脚本,它是在网站上实现动态页面的最简单和常用的方法。
      服务器 <-> CGI <-> 用户

    2. DBI模块
      DBI(database interface)数据库接口

    use DBI;
    $dbh = DBI -> connect($data_source,$username,$password);
    
    1. DateTime模块
      处理日期和时间。
    my $dt = DateTime -> from_epoch(epoch =>  time);
    print $dt->ymd;
    

    -------第十二章 文件测试 - -----------------

    文件测试操作符

    -r -w -x -o :对目前的用户或组可读/写/执行/拥有的文件或目录
    -R -W -X -O :对实际的用户或组可读/写/执行/拥有的文件或目录
    -e:文件/目录存在
    -z:文件存在且无内容
    -s:文件/目录存在且有内容
    -f: 普通文件
    -d: 目录
    -l:符号链接
    -S:socket类型文件
    -p:命名管道
    -b:块设备文件(如挂载磁盘)
    -c:字符设备文件(如I/O设备)
    -M:最后一次被修改后至今的天数
    -A:最后一次被访问后至今的天数
    -C:最后一次文件节点编号改变至今的天数
    -u/-g/-k/-t/-T/-B
    
    

    示例:

    die "$filename  already exists\n" if -e $filename;
    
    warn "config file is old" if -M CONFIG >28;
    
    my @original = qw(these are test files);
    my @big_old;
    foreach my $filename(@original){
        push @big_old, $filename 
            if -s $filename >100_000 and -A $filename >90;
    }
    

    测试同一文件的多项属性

    if(-r $file and -w $file){...}
    if(-r $file and -w _){...} #虚拟文件句柄_
    if(-r -w -x -o -d $file){...} #栈式写法,一般只用于真假判断
    
    • local函数:显示现在时间,格式如Wed May 29 21:41:21 2019

    -----------第十三章 目录操作------------------

    切换目录

    chdir : 类似shell的cd
    chdir '/etc' or die "can't chdir to /etc: $!";
    

    文件名通配

    my @all_files = glob '*'; #匹配所有文件(按字母顺序),但不包括点号开头文件
    my @all_files = <*>; #文件名通配的另一种写法
    my @pm_files = glob '*.pm'; #匹配所有pm文件
    

    目录句柄

    opendir  #对应open
    readdir  #对应readline
    closedir  #对应close
    #注意读到的是目录中的文件名,而非文件内容
    
    my $dir = '/home/pjx';
    opendir DIR, $dir or die "can't open $dir: $!"; 
    foreach $file (readdir DIR){
        print "one file in $dir is $file\n";
    }
    closedir DIR;
    #同样可用目录句柄变量my $dh来代替裸字
    
    #如只想处理以pm结尾的文件:
    while($name = readdir $dh){
        next unless $name =~ /\.pm$/;
        ...
    }
    
    #readir操作符返回的文件名不包含路径,仅文件名。
    

    删除文件

    unlink #删除文件
    rmdir  #删除目录
    
    unlink qw(one two three);
    unlink glob '*.pm';
    
    my $sucess = unlink "one","two","three";
    #unlink返回删除文件的个数
    

    文件重命名

    rename 'old','new'; #重命名文件
    rename 'my/path/filename', 'filename'; #移动目录到同名目录
    rename 'my/path/filename' => 'filename'; #同上的另一种写法
    

    链接

    link #硬链接
    symlink #软链接(符号链接)
    readlink #取得软链接指向位置
    unlink  #移除链接
    
    link 'chicken', 'egg' or warn "can't link: $!";
    symlink 'chicken', 'egg' or warn "can't link: $!";
    #系统中我们的perl路径 /usr/bin/perl或/usr/local/bin/perl通常是软链接,指向真正的Perl二进制文件
    my $where = readlink 'egg'; #得到'chicken'
    my $perl = readlink '/usr/bin/perl'; #指向实际的perl程序
    

    创建/删除目录

    #创建mkdir
    mkdir 'fred',0755 or warn "can't make fred: $!"; 
    #0755初始权限
    
    #删除unlink+rmdir
    #rmdir只能删除空目录,所以需要先用unlink删除目录中内容
    unlink glob "$temp_dir/.*";
    rmdir $temp_dir;
    

    修改权限

    chmod 0755 ,'fred','barney';
    #不能接受u+x类似参数
    

    修改隶属关系

    chown 1004, 100, glob '*.pm';
    #用户及用户组标识符只能用数字形式
    

    修改时间戳

    utime time, time-24*60*60, glob '*';
    
  • 相关阅读:
    对post提交数据Content-Type的理解
    预加载的实现方式
    ajax跨域简单请求与复杂请求
    web前端图片模糊到清晰的实现过程
    vue子组件调用父组件的方法
    vue子组件如何向父组件传值
    如何实现下拉弹出框渐渐弹出
    DynamicObject扩展--实现JSON和DynamicObject的序列化与反序列化
    解决 Bash On Windows 下载慢或无法下载的问题
    NPOI扩展--判断指定单元格是否为合并单元格和输出该单元格的行列跨度(维度)
  • 原文地址:https://www.cnblogs.com/jessepeng/p/10962658.html
Copyright © 2020-2023  润新知