zoukankan      html  css  js  c++  java
  • Perl 语言入门15

    第一章 简介

    perl -v

    文字处理,编写小型CGI脚本(Web服务器调用程序)的最佳语言

    CPAN: Perl综合典藏网

    shebang:
    #! /usr/bin/perl #! /usr/local/bin/perl

    perldoc

    第二章 标量

    • 数字
    1.25  
    -1.2e24  
    3  
    61_300_100  
    0377 #八进制  
    0xff #十六进制  
    ob1111111 #十六进制  
    
    • 运算符
    +
    -
    *
    /
    %
    **
    
    • 单引号和双引号
    'hello\n'  #\n两个字符
    "hello\n"  #换行符
    
    双引号内转义:
    \n
    \r #回车
    \t
    \f #换页
    \b #退格
    \\ #单反斜线
    \l #下个字母变小写
    \L #所有字母变小写
    \u 
    \U
    
    • 字符串操作符
    "hello" . "world"  #"helloworld",连接操作符必须显式
    "fred"x3
    5x4.8  #"5555"
    
    "12fred34" * "3"  #36 数字与字符串自动转换
    
    • Perl内置警告
    #! /usr/bin/perl -w
    
    #! /usr/bin/perl
    use warnings;
    
    #! /usr/bin/perl
    use diagnostics; #更为详尽的警告
    
    • 双目赋值操作符
    $fred = $fred + 5; $fred += 5;
    $barney = $barney * 5; $barney *= 5;
    $str = $str. "";  $str .=""; #等于追加操作符
    
    • 标量内插
    print "the answer is", 6*7, ".\n";
    
    $meal = "steak";
    $bar = "fred eat a $meal"; #等价
    $bar = "fred eat a". $meal;
    $bar = "fred eat ${meal}s.\n"; #steaks
    
    #单引号不能内插变量
    
    • 比较操作符
    数字:==   !=  <  >   <=   >= 
    字符串:eq  ne  lt gt le ge
    
    • if控制结构
    比较操作符:以上
    布尔值:1(True) undef(False)
    
    • 获取用户输入 <STDIN>

    • 去除末尾换行符:chmop

    • chomp($text = <STDIN>)

    • undef 未定义值,空的,变量首次赋值前就是这个。所以才可用$sum += 4$string .= "more text\n"等操作

    • defined函数:判断某个字符是undef而非空字符串,如果是undef,则返回假

    第三章 列表与数组

    • 列表是数据,数组是储存列表的变量
    • $#array最后一个数组元素的索引
    • 列表直接量
    (1,2,3,"red")
    (1..5,9)
    (5..1) #空列表,因为只能向上计数
    (0..$#array)
    ($m..$n)
    ("fred","barney","betty")
    #简写:省去引号逗号
    qw(fred barney betty)
    qw! fred barney betty !
    qw(this is a test\!) #转义
    
    • 列表赋值:
    ($fred,$barney)=("test",undef)
    ($fred,$barney)=qw(a,b,c,d) #忽略cd
    ($fred,$barney)=qw(a) #$barney自动为undef
    @rocks=qw(slate lava)
    #数组只能包含标量,不能包含其他数组?
    
    • 数组函数:
    #pop:弹出数组最后一个元素
    @array = 5..9;
    $fred = pop @array;
    
    #push:压入一个元素到数组最后
    push (@array,8);
    push  @array, 1..10;
    @other = qw(1 2 3);
    push @array, @other; #注意不能直接操作列表
    
    #shift:取出数组第一个元素
    $m = shift @array;
    
    #unshift:添加数组第一个元素
    unshift @array,6;
    unshift @array,@other;
    
    #splice:添加或删除数组的中间元素
    @remove = splice @array, 2; #删除原数组第三个元素后的所有元素
    @remove = splice @array,2,3; #删除第3,4,5个元素(第3个参数表长度)
    @remove = splice @array,1,2,qw(new); #第四个参数表补充新元素到原数组
    
    • 字符串中数组内插
    print "this is a @test\n";
    #所以不想内插时@需要转义(或单引号)
    
    • foreach 遍历数组
    @rocks = qw(bedrock slate lava);
    foreach $rock (@rocks){
        $rock = "\t$rock";
        $rock .= "\n";
    }
    print "The rocks are:\n",@rocks;
    
    • 默认变量$_
    foreach(1..10){print "i can count to $_!"}
    
    • reverse操作符
    @fred= 6..10;
    @two = reverse @fred;
    @three = reverse 6..10;
    
    • sort操作符
    @rocks = qw(one two three four);
    @sorted = sort @rocks;
    @numbers = sort 98..101; #不是按数值大小排序,而是按ASCII码
    
    • each 操作符:返回索引和值
    while(my($index,$value) = each @rocks){
        print "$index: $value";
    }
    #效果同下:
    foreach $index(0..$#rocks){
        print "$index: $rocks[$index]\n";
    }
    
    • 标量/列表上下文
      -- 定义:同一个表达式在不同的地方具有不同的意义
    @people = qw(one two three);
    @sorted = sort @people; #one two three 列表上下文
    $number = 42 + @people; #45 标量上下文
    

    -- 在标量上下文中使用列表表达式

    $test = reverse qw(one two); #得到owteno
    

    -- 在列表上下文中使用标量表达式

    @fred = 6*7; #生成单个元素的列表
    @test = "hello" . ' ' . "world";
    @test = undef; #含一个未定义元素的列表
    @test = ( ); 清空数组
    

    -- 强制指定标量上下文:scalar函数

    print "I have @rocks rocks!\n";  #输出数组元素
    print "I have scalar @rocks rocks!\n"; #输出元素数量,error! 函数不能直接内插
    print "I have ", scalar @rocks,  "rocks!\n";
    
    • 列表中的
    @lines = <STDIN>; #读入所有行
    chomp @lines; #去掉所有换行符
    #等同如下效果:
    chomp(@lines = <STDIN>);
    

    linux系统ctrl D停止输入,Windows系统ctrl Z停止输入

    第四章 子程序

    子程序:subroutine用户自定义函数
    调用符号:&
    子程序是全局的,如果存在两个相同的子程序,后一个会覆盖前一个。子程序可放任意位置,一般在开头或结尾。

    • 定义子程序
    sub marine { #关键字sub,程序名marine
        $n += 1;
        print "hello,sailor number $n!\n"
    }
    
    &marine;
    
    • 返回值
      默认返回最后一次运算结果
    sub test{
        print "this is a subroutine test"; #主要用于调试
        $one+$two; #返回值
    }
    $one = 3; $two = 5;
    $three = &test;
    print "\$three is $three";
    
    • 参数:argument
      -- 参数列表用数组变量@_,这是子程序的私有变量 ,第一个参数$_[0],第二个参数$_[1]......
    sub max{
        if ($_[0] > $_[1]) {$_[0]} else {$_[1]}
    }
    
    • 子程序中的私有变量/词法变量
      最好对每个新变量都使用my声明,让其保持在自己所在的词法作用域内。
      使用use strict编译指令,强制使用一些严格的、良好的编程风格。
    #几乎所有子程序都用到
    sub max{
        my($m,$n) = @_; #将参数赋值给私有变量
        if ($m > $n) {$m} else {$n}
    }
    
    • 变长参数
    #把任意长度参数列表作为参数传给子程序
    sub max{
        if(@_!=2){
            print "warning! &max should get two arguments\n";
        }
        ......
    }
    
    #改进上述子程序,使其接受任意长度的参数
    $maximum = &max(3,4,10,5);
    sub max{
        my($max_sofar) = shift @_; #暂时将第一个值作为最大值
        foreach($_ > $max_sofar){  #遍历其他值并进行比较
            $max_sofar = $_;
        }
        $max_sofar;
    }
    

    对于$_ @_等内置变量不需事先声明

    • return操作符
      立即停止并从子程序内返回某个值。
    # 找出数组中某值的索引
    my @names = qw(one two three);
    my $index = &find_index("two",@names);
    
    sub find_index{
        my($what,@array) = @_;
        foreach(0..$#array){
            if($what eq $array[$_]){
                return $_;
            }
        }
        -1;  #可省略return
    }
    
    • 子程序返回非标量:如列表、undef(直接在后面加return,一般用于调试子程序有误)
    sub list {
       if($x < $y){
           $x..$y;
       } else {
            reverse $y..$x;
       }
    }
    $x = 11;
    $y = 6;
    @z = &list;
    
    • 持久性私有变量:state
      多次调用子程序时,保留上次调用变量的值

    第五章 输入与输出

    • 读取标准输入:
      行输入操作:chomp($line = <STDIN>);
    while (defined ($line = <STDIN>)){ #读取、赋值、是否定义变量
        print "I saw $line";
    }
    #等同于
    while(<STDIN>){print "I saw $_";}
    #比较foreach
    foreach(<STDIN>){print "I saw $_";}
    #while逐行读取
    #foreach全部读取作为列表,再逐项处理列表内容
    

    钻石操作符读入:

    while(<>){
        chomp; #默认作用在$_
        print "It was $_ that I saw!\n";
    }
    
    • 调用参数:@ARGV
    @ARGV = qw(file1 file2 file3);
    while(<>){chomp;print "It was $_\n";}
    #钻石操作符对ARGV的文件一行行读取,若为空,则改用标准输入流
    
    • 输出到标准输出
    print @names; # 打印数组元素(无空格)
    print "@names"; #数组元素内插(有空格)
    print (2+3)*4; #5
    print ((2+3)*4); #20
    
    • printf格式化输出
    #两个参数:格式化(引号内),数据(引号外)
    printf "hello, %s, you have %d books\n", $user, $num;
    $user = pjx;
    $num = 5;
    

    格式化符号:

    %g 自动选择浮点数、整数或指数
    %d 十进制整数
    %s 字符串
    %f 浮点数
    %% 百分号
    
    eg:
    printf "%g %g %g\n",5/2,51/17,51**17; #2.5 3 1.07e+29
    printf "in %d days\n", 13.23; #in 13 days
    printf "%6d\n", 45; #整数字段式右对齐
    printf "%2d\n", 4567; #整数字段式左对齐
    printf "%10s\n", "willma"; #字符串字段式右对齐
    printf "%-10s\n", "willma"; #字符串字段式左对齐
    printf "%12f\n", 6*7 + 2/3; #浮点数右对齐
    printf "%0.3f\n", 6*7 +2/3; #三位小数 等于%.3f 
    printf "%.2f%%\n", 5.25/12; #0.44%
    
    
    • 文件句柄
      Perl进程和外界的一种I/O联系的名称;
      建议全大写字母来命名;
      6个特殊文件句柄名:STDIN(标准输入流,默认键盘), STDOUT(标准输出流,默认屏幕), STDERR(标准错误流,默认屏幕), DATA, ARGV

    • 打开文件句柄

    open CONFIG, 'dino';
    open CONFIG, '<dino'; #只读非写方式读入
    open IN, ">fred"; 重定向写入
    open LOG, ">>logfile"; 追加写入,一般用于日志文件中
    
    #另一种写法更为安全:
    open CONFIG, '<','dino';
    open CONFIG, '>',$file;
    open LOG, '>>', &logfile_names();
    
    #这种方法还能指定数据编码方式:
    open IN, '<:encoding(UTF-8)','dino';
    open IN, '<:crlf', $file; #CR-LF对(:crlf层)是DOS风格换行符(\r\n),Unix风格(\n)
    open OUT, '>:crlf', $file;
    
    • 关闭文件句柄
      表示对数据流的处理已全部完成。
      当重新打开某个句柄时,perl会自动关闭原句柄。
      在程序结束时,perl也会自动关闭文件句柄。
      最好一个open搭配一个close。
    close IN;
    
    • die处理致命错误
      unix上每个运行程序都有一个退出状态(exit status),一般0代表成功,非0代表失败。
    if(! open LOG, '>>', 'logfile'){die "can't create logfile: $!"} #特殊变量$!表解释性的系统错误信息
    if(@ARGV <2 ){die "not enough arguments\n"}
    
    • warn发出普通警告信息
      功能和die类似,但不会终止程序。
      die和warn以及Perl内部的出错信息都会自动默认送到STDERR。 也可指定到错误日志中。

    • say输出
      功能和print差不多。但每行内容会自动加上换行符。

    say "hello perl!";
    say IN, "hello"; #指定句柄
    
    • 标量变量中的文件句柄
      一般小脚本(如生物信息),用裸字更快捷。对于大一点的程序,用标量变量存储文件句柄,控制作用域,方便调试和维护。
    my $rock_fh; #确保该变量预先是空的
    open $rock_fh, '<', 'rock.txt' or die "could not open rock.txt: $!";
    while(<$rock_fh>){
        chomp;
        ...
        foreach my $rock (qw(slate lava grant)){
            say $rock_fh $rock; #句柄变量无逗号
        }
    }
    print $rock_fh "limestone\n"; #句柄变量后无逗号
    close $rock_fh;
    

    与裸字的不同:

    print $rock_fh, "limestone\n"; #error
    print STDOUT;
    print $rock_fh;  #error,perl会认为是个标量变量
    print {$rock_fh};  #正确打印$_中内容
    
    
  • 相关阅读:
    mysqlEasyHelper(待完善)
    入门day2
    入门day1
    c# 多态的理解
    c# 简单任务控制
    c# 陌生的关键字
    从0来搭建超灵活的MVP商用框架<三>-------网络层加入RxJava、事件总线封装、Dagger2集成
    从0来搭建超灵活的MVP商用框架<二>-------APP基础配置、Okhttp+Retrofit封装
    从0来搭建超灵活的MVP商用框架<一>-------从MVC至MVP的转变、通用网络切换框架
    IOC注入框架设计<三>-------Android Studio插件开发来自动生成ButterKnife相关代码
  • 原文地址:https://www.cnblogs.com/jessepeng/p/10962626.html
Copyright © 2011-2022 走看看