• Perl 语法


    perl语言的核心是正则表达式,在文本处理上非常有优势,与python类似,但语法不同,perl的语法很灵活,用多了才会觉得好用。

    常用知识点总结:

    • perl语法类似于C语言(perl源于Unix),语句由逗号划分,代码层次使用花括号{}划分,但是不必声明变量类型;
    • 标量变量($name),数组(@name),哈希结构(%name),类型标识符,文件句柄没有标识符;
    • 哈希结构可以使用列表创建,但不要以为它也是由圆括号括起来的;在使用键时,用花括号。(特别注意)
    • 数字之间比较用(==、>=、<=、!=),字符串之间比较则用(eq、gt、lt、ge、le)
    • print函数,不一定需要括号。几种情况:print $name(直接输出) ;print ‘$name’(基本不用,错误的,原样输出);          print “$name”(有时会用,会自动替换); print 函数在做文件输入时(文件句柄),不能有逗号,只能用空格。
    • @_ 是函数传参时放置参数的数组,可以从中取实参;$_ 是默认参数的意思,指的是在不指定的情况下,程序处理的上一个变量;shift 是将数组的第一个元素 $array[0] 移走, 并将这个元素回传(return) (堆栈一节有详细讲解)。
    • shift函数是取数组的第一个元素,缺省就取@_的第一个函数,这句一般用在程序的开头,用于接收程序的参数,或者子函数的开头,用于接收子函数的参数。
    • 句柄和文件的关系,文件必须被打开,并赋与句柄,才能操作;有的句柄可以直接使用,如STDIN、STDERR;广义上,标量变量就是一种代表数据的句柄。
    • perl中数值和字符串可以随意的使用递增和递减运算符。

     

    第1学时 P e r l 入门


    • 安装perl
    • perl内部文档
    • 第一个perl脚本

    通用编程语言,胶水语言,perl擅长将其他程序连接到一起。

    # 检查perl是否安装成功
    perl -v

    ActiveState Tool公司提供了一个自行安装Perl的工具(安装十分简单)。

    # 在Linux下安装perl
    # 解压 tar -zxvf stable.tar.gz -C dir
    $ gunzip stable.tar.gz
    $ tar xf stable.tar
    # 配置
    $ sh Configure
    # 安装
    $ make
    $ make test  #测试是否make成功
    # make install

    安装文件有完整的perl帮助文档

    perldoc perl

    perl手册分如下三个部分:

    • perlfunc
    • perlop
    • perlfaq

    perl perlfunc

    # 查找某个函数名
    perldoc -tf print
    # 搜索FAQ文件
    perldoc -q support

    各人不推荐在命令行窗口查阅文档,阅读模式太不友好,可以阅读HTML格式文档。

    可以在浏览器中打开本地HTML文档:file:///D:/Program%20Files/Perl64/html/index.html

    #第一个perl程序
    #!/usr/bin/perl -w
    print "Hello, World!
    ";

    #运行perl脚本
    perl test.pl

    linux下可以以可执行文件形式运行perl脚本,但首先必须修改权限,使其可执行。

    chmod 755 test.pl
    ./test.pl

     

    第2学时 P e r l 的基本构件:数字和字符串

    • 标量常量:数字 和 字符串
    • 标量变量:存放标量,

    字符串

    只有使用转义字符才能在字符串中插入特殊的字符。

    • 单引号:‘ ’中的每个字符都表示它本身,$a, 等等,都不会进行处理,原样输出
    • 双引号:“ ”中Perl会查看是否存在 变量名 和 转义序列,一旦发现,会自动替换

    如何便捷的将字符串用 双引号 或 单引号 括起来?

    • qq运算符:qq(I said, “I love you!”)   用法如上
    • q运算符: q(Tom’s tree)   用法与之前单引号一样,会原样输出单引号内的所有内容。

    标量变量

    特殊变量($_):当前默认值,

    运算符(运算符之间可以有空格)

    数字运算符有哪些?  

    加+;减-;乘*;除/;求余%;取幂**;

    字符串运算符有哪些?  

    • 并置运算符(.)(运算对象必须为字符串标量或者标量变量);
    • 可以使用反斜杠,指定屏蔽字符串内的内插替换(标量变量和转义字符);
    • 如果字符串中标量名和字符串过于紧密,可以用{}显示指定变量名,如${name}space;
    • 重复运算符(x),如“-”x 10;

    带名字运算符?

    int(5.20); length(“nose”); lc(“ME TOO”); uc(“hal 9000”); cos(50); rand(5)(返回随机浮点数,默认是0-1)

    尖括号运算符?

    用于读写文件,<STDIN>,从标准输入读入一行;默认会读入我们最后输入的回车,可以使用从chomp运算符去掉;

    chomp可以去除任何参数结尾的换行符,返回被删除的字符数(删除了返回1,没删除返回0)。

     

    第3学时 控制程序流 (foreach是核心)

    • 语句块
    • 运算符
    • 循环
    • 标号
    • 退出perl

    if语句(几乎与C语言类似,除了elsif)

    $r = 10;
    if ($r == 10){
        print '$r is 10!';
    }
    elsif ($r == 20){
        print '$r is 20!';
    }
    else{
        print '$r is neither 10 nor 20.'
    }

    # 如果只有一个条件可以把if放到后面
    print "Hello!" if (1 == 1);

    字符关系运算符(类似于=, >, <, >=, <=, !=)?  

    • eq等于;
    • gt大于;
    • lt小于;
    • ge大于等于;
    • le小于等于;
    • ne不等于;

    perl中有哪些假值?  0;“”;‘’;‘0’;“0”;undef;

    逻辑运算符有哪些?  and; or; not;

    if ($x and $y and not $z){
        print "All conditions met.
    ";
    }else{
        print "Not all.
    "
    }

    逻辑运算符短路,即一旦确定表达式是真或假,就立即停止逻辑表达式的计算,最常见的是

    open(FILE, "test.txt") or die "can't open file:$!
    ";

     

    循环语句(与C语言完全相同)

    $count = 0;
    while($count <= 10){
        print "$count
    ";
        $count++;
    }

    for($i; $i <= 10; $i++){
        print "i is now $i
    ";
    }

    #  高级perl技巧:使用foreach进行遍历
    @name = qw(li zhi xin);
    print "my name is ";
    foreach $name (@name){  # $name是对@name中元素的引用,可以修改@name
        print "$name "
    }

     

    流程控制工具

    last语句(退出当前循环)(等同于C里的break)

    $count = 1;
    while($count <= 15){
        last if ($count == 5);
        print "$count
    ";
        $count++;
    }

    for($i=0; $i <= 100; $i++){
        for($j=0; $j <= 100; $j++){
            if ($i * $j == 140){
                print "The product of $i and $j is 140.
    ";
                last;
            }
        }
    }

    next语句(回到当前循环头部)(等同于C里的continue)

    for($i=0; $i <= 100; $i++){
        next if (not $i % 2);
        print "An odd number = $i
    ";
    }

    语句块和循环语句可以设置标号,last、redo 和 next都可以带一个标号。(等价于C的loop语句)

    退出perl?  exit 0;代表正常退出perl。

     

    第4学时 基本构件的堆栈:列表与数组

    • 填充和清空数组
    • 逐个元素查看数组
    • 对数组进行排序和输出
    • 标量分割为数组
    • 数组合并为标量

    列表是常量,数组是变量,可以将列表存放在数组当中。如:

    12,’abc‘,3.14,True)   # 这是一个直接量列表

    如果列表中全部是字符串,为了避免注意添加单引号,可以使用qw运算符,如

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

    列表的范围运算符(..)

    @a = (1..10)
    @b = (1..10, 21..30)
    # 字符照样可以使用范围运算符
    @list=(aa..zz);
    foreach (@list){
        print "$_ ";
    }

    为什么要把列表这个东西单独拿出来?

    因为列表是有特殊作用的常量,可以对其他结构进行初始化(数组和哈希)。

    数组(列表)之内的数组会自动合并成一个大的数组。

    可以利用数组的特性进行批量赋值

    ($a, $b, $c) = qw(li zhi xin);

    如何从数组中获取元素?

    @name=qw(li zhi xin);
    print @name;  #没有空格
    print "
    @name
    "; #元素之间有空格
    print scalar(@name);  #输出数组元素个数

    @a = qw(li zhi xin);
    print @a;   #  每个数组元素之间紧密排列,没有空格和换行

    @a = qw(li zhi xin);
    print $a[0];
    print $a[1];
    print "
    ";
    $a[2] = "wei";
    print @a;

    如何将数组划分成片?

    @a = qw(li zhi xin 1 2 3 4 5 6);
    @b = @a[2,4,6];
    print @b;

    如何寻找数组的结尾?

    @a = qw(li zhi xin 1 2 3 4 5 6);
    print $#a;   # 返回结尾元素的索引

    @a = qw(li zhi xin 1 2 3 4 5 6);
    $size = @a;
    print $size;   #根据上下文,返回数组元素的个数

    print $a[-1];   #  返回数组的最后一个元素

    如何测试数组中是否包含元素?

    @mydata = qw(li zhi xin);
    if (@mydata){
        print "Not empty!
    ";
    }

    上下文

    • 标量上下文
    • 列表上下文

    强制使参数成为上下文?

    print scalar(@mydata);   #  scalar( )函数

    $a = <STDIN>;  # 读入一行
    @whole = <STDIN>;  # 读入整个
    ($a) = <STDIN>;   # 全部读取,但只保存一行到$a

    @stars = ('*') x 10;
    foreach $star (@stars){
        print "$star
    ";
    }

    print scalar(localtime);

    chomp:标量下,去除标量结尾记录分隔符;列表下,去除每个标量结尾记录分隔符。<STDIN>同理。

    对数组进行操作

    如何遍历?

    #  普通方法:使用for循环进行遍历
    @name = qw(li zhi xin);
    print "my name is ";
    for ($index = 0; $index < @name; $index++){
        print "$name[$index] ";
    }

    #  高级perl技巧:使用foreach进行遍历
    @name = qw(li zhi xin);
    print "my name is ";
    foreach $name (@name){  # $name是对@name中元素的引用,可以修改@name
        print "$name "
    }

    foreach遍历时,标量为列表元素的引用,可以同时修改数组(列表)中的元素。

    数组和标量之间进行转换?

    split函数,拥有一个模式和一个标量,可以使用模式来分割标量。

    join函数,去除一个字符串和一个数组(列表),使用该字符串将数组中的元素连接起来。

    @word = split(/ /, "The quick brown fox");
    foreach $word (@word){
        print "$word
    "
    }

    $numbers=join(',', (1..10));
    print $numbers;

    数组排序?

    排序后,原始的数组不变(python比较智能,有两种排序函数)。

    @chiefs = qw(li zhi xin);
    print join(' ', sort @chiefs);

    指定方法排序(硬方法 和 飞船运算符):

    @numbers=(1,5,2,7,3,8,4);
    @sorted=sort {return(1) if($a>$b);
    return(0) if($a==$b);
    return(-1) if($a<$b);
    } @numbers;
    print @sorted;

    @numbers=(1,5,2,7,3,8,4);
    @sorted=sort {$a <=> $b} @numbers; #a,b的顺序决定排序的类型
    print @sorted;

    字符串排序,需要使用cmp运算符,编写一个复杂的排序代码。

    倒序操作?

    分标量上下文(对标量里每个字符倒序) 和 列表上下文(对元素整体倒序)。

    @lines = qw(li zhi xin);
    print join(' ', reverse @lines);

     

    第5学时 进行文件操作

    perl的标量可以延长,存放足够长的一行内容;perl的数组可以扩展,可以存放文件的全部内容。

    不在将输入和输出局限于键盘和终端,可以将输入和输出定向到指定文件

    • 打开和关闭文件
    • 将数据写入文件
    • 从文件读取数据
    • 健壮性

    打开文件

    文件句柄是对特定文件的一个引用(也是一种变量),包含了如何打开文件(文件位置)、位置信息(读到哪了)和读写属性(只读、覆盖、追加)。STDIN通常与键盘相连,从键盘输入信息。最好使用大写字母。

    如果想打开文件,必须先创建一个句柄:open(filename, pathname),若打开失败,就会返回undef。

    # 低级的打开和撤销策略
    if (open(MYFILE, "mydatafile")){
        # 成功运行
    }else{
        print "Cannot open mydatafile!
    ";
        exit 1;
    }

    die函数可以停止函数的运行,利用了条件语句的执行特性

    # 升级版打开或撤销
    open(MYTEXT, "novel.txt") || die; 
    close(MYTEXT);

    默认是在当前文件夹查找文件,可以指定路径名。

    # die函数升级版:$!系统需要的最后一个操作的出错消
    open(MYFILE, "myfile") or die "Cannot open myfile: $!
    ";

    # 用warn取代die,程序不停止,只发出警告。
    if (!open(MYFILE, "output")){
        warn "Cannot read output: $!
    ";
    }else{
        # 执行代码
    }

     

    读取文件

    读取一行文本,完全类似于<STDIN>,默认该句柄已经打开。

    # 读取一行文本  文件读完了<MYFILE>返回 undef
    open(MYFILE, "myfile") or die "Can't open myfile: $!
    ";
    $line = <MYFILE>;

    读取和输出整个文件

    while(defined($a=<MYFLIE>)){  #defind()函数,检查表达式的值是否是undef
        print $a;
    }

    # 高级写法
    while(<MYFILE>){
        print $_;
    }

    # 使用列表读取存储整个文件,只有在文件非常小时才这么做,非常耗内存。
    open(MYFILE, "novel.txt") or die "$!";
    @content = <MYFILE>;
    close(MYFILE);

    以下是语法在只读模式打开file.txt的。这里小于< signe 指示,文件必须以只读模式运行结束:

    open(DATA, "<file.txt");
    while(<DATA>){
       print "$_";
    }

     

    写入文件

    想要写入文件,在打开文件句柄时就必须指定文件的打开方式(>, >>)。

    # 写入并覆盖
    open(NEWTH, ">output.txt") or die "Opening output.txt: $!";
    # 写入并追加
    open(APPFH, ">>logfile.txt") or "Opening logfile.txt: $!";

    也可以用print( )将数据写入文件句柄

    open(LOGF, ">>logfile") or die "$!";
    if (! print LOGF "Time", scalar(localtime), "
    "){
        warn "Unable to write to the log file: $!";
    }
    close(LOGF);

    自由文件句柄

    perl启动时会默认打开三个文件句柄:STDOUTSTDINSTDERR,它们默认均与终端相连。

    print函数默认是使用STDOUT

    如何写入二进制的数据?

    open(FH, "camel.gif") or die "$!";
    binmode(FH);  # 标记为二进制文件
    print FH "GIF87a5601451500";
    close(FH);

    文件测试(检查文件是否存在,权限)

    -e  #文件存在,则真
    -d  #是个目录,则真
    -r  #文件可读,则真
    -T  #文本文件,则真
    -B  #二进制文件,则真

    if (-s $filename){
        warn "$file contents will be overwritten!
    ";
        warn "$file was last updated", -M $filename, "days ago.
    ";
    }

     

    第6学时 模式匹配(perl的核心

    识别输入数据流的模式(模式==正则表达式),需要对数据进行格式化,简单的split函数无法完成。

    • 创建简单的正则表达式
    • 正则表达式进行模式匹配
    • 正则表达式编辑字符串

    什么是模式?

    模式被括在模式匹配运算符中间,基本形式:m//;如:m/simon/。($_常常作为匹配的默认值)

    print "yes
    " if(m/Piglet/);  # 如果使用的是斜杠//,那么m可以省略。

    • 除非是元字符,否则会严格匹配(可以用屏蔽元字符)
    • 可以使用任意匹配的字符来替代斜杠(如m::)
    • 如果是斜杠,则可以省略前面的m
    • 变量也可以放在匹配模式里

    元字符

    # 圆点(.):匹配除了换行符外的任何单个字符,必须存在一个字符,但不能多于一个,仅且只能。
    /p.t/  #可以匹配pot、pat,不能pt,不能paat;
    #以下都是通配符(并非一对一)
    # (+):使前面的字符与后面的字符最少匹配一次
    /do+g/ #可以匹配dog、dooooog,不能dg;
    # (*):进行0次或多次匹配,与(+)非常类似,但可以0次(注意:这和shell下的通配符意义完全不同)
    /car*t/   #可以匹配cart、cat、carrrt;
    # (?):前面的字符进行0次或一次匹配(不能超过一次),限定死了,0次或1次,只有两种可能
    /c?ola/   #可以匹配cola、ola
    
    # pat{n, m} # n:匹配的最小次数;m:匹配的最大次数
    /x{5, 10}/  #x最少匹配5次,最多匹配10次
    # (.*):可以匹配任何东西

    字符类(特征[],必须有方括号加以限定)

    [abcde]  #匹配其中任何一个字符
    [a-e]    #同上
    G        #匹配G或者g
    [0-9]    #匹配一个数字
    
    [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相反

    分组和选择(这个开始有点复杂)

    if(/dogs|cats/){
        print "$_ contains a pet
    ";
    }

    /(fr|b|fl|cl)og/;

    在列表上下文中,匹配运算符返回匹配表达式各部分的列表,每个加括号()的都是其中一个返回值,其中$1是第一个匹配的括号。

    $_="apple is red";
    ($fruit, $color) = /(.*)siss(.*)/;
    print $fruit." ";
    print $color;

     

    /^Help/   #只匹配Help开头的行
    /^one.*two$/   #只匹配one开头和two结尾的行
    /^only$/   #只匹配包含only的行
    /^$/   #匹配空行
    /^/    #匹配非空行

    替换

    替换运算符(s///):s/查找模式/替换模式/;

    $_="Our house is in the middle of our street.";
    s/middle/end/;
    s/in/at/;
    {do something} if (s/apartment/condo/);

    对其他变量进行模式匹配操作(对非$_变量使用匹配运算符,必须用=~将变量与模式连接起来)

    $a="apple is red";
    ($fruit, $color) = $a=~/(.*)siss(.*)/;

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

    /macbeth/i  #不考虑大小写

    反向引用(将括号用于正则表达式)

    括号内的匹配模式被记录在特殊的变量当中,分别为$1, $2, $3, $4.

    $number="800-555-1212";
    if ($number =~ /(d{3})-(d{3})-(d{4})/){
        print "the area code is $1";
    }

    模式匹配运行成功时,变量$1, $2, $3才被设置,之后会被清除。(还是不懂什么时候可以用???)

    强大的grep函数(以任意的条件搜索数组)

    #grep迭代运行通过list中的每个元素,$_设置为列表的每个元素,然后依次执行表达式或模式匹配,表达式为真,则返回该元素,赋值给数组。
    @dogs=qw(greyhound bllodhound terrier mutt chihuahua);
    @hound=grep /hound/, @dogs;
    print "@hound";

    #$_为实际值的引用,可以修改原始元素
    @dogs=qw(greyhound bllodhound terrier mutt chihuahua);
    @hound=grep s/hound/hounds/, @dogs;
    print "@hound";

    #grep可以使用任何表达式
    @dogs=qw(greyhound bllodhound terrier mutt chihuahua);
    @hound=grep length($_)>8, @dogs;
    print "@hound";

    map函数

     

    第7学时 哈希结构(%)

    • 创建哈希结构
    • 哈希中插入和删除元素
    • 用哈希对数组进行操作

    哈希结构不用定义,可以直接使用,对哈希中单个元素进行赋值就可以创建哈希结构,如下:

    $record{'name'} = "lizhixin"; #原汁原味的哈希
    print $record{name}; #引号可以省略,可以识别其为字符串,因为变量有$

    整个哈希结构可以使用(% info)来操作,比如创建和赋值:

    # 就这么两行,想一次性写对还是挺难的
    %info=('name', 'lizhixin', 'age', '24');   #可以以=>的形式创建
    print $info{'name'};   # 引号可以省略

    注意:我们只能用列表来创建哈希,因此第一行只能用圆括号(),而不能使用花括号{ },这和python中的用法不同。

    而是想访问哈希中的某个元素的时候,只能以($)开头,表示单个哈希元素,哈希的键值必须用花括号{}包裹,本例中{}里面的键必须用单引号包裹,否则name可能是个变量,解释器无法识别

    如何遍历哈希结构中的键 和 值?(keys函数 和 values函数),低级遍历

    foreach $a (values %dict)  # or keys %dict{
        print "$a
    "
    }

    如何按值来检索哈希中的元素?反转,此例为高级遍历。

    %hash = ("li"=>"1", "zhi"=>"2", "xin"=>"3");
    %re_hash = reverse %hash;
    foreach (keys %re_hash){
        print "$_ => $re_hash{$_}
    "
    }

    如何在列表(数组)和哈希之间转换? 很简单,直接互相赋值

    %hash = ("li"=>"1", "zhi"=>"2", "xin"=>"3");
    @hash = %hash;
    foreach (@hash){
        print "$_
    ";
    }

    如何测试哈希结构中是否存在某个关键字? 可以自己写个函数,也可以直接用现成的exist()函数

    # 自己写的exist函数
    %hash = ("li"=>"1", "zhi"=>"2", "xin"=>"3");
    $hash = "liz";
    $flag = 0;
    foreach (keys %hash){
        $flag = 1 if($_ eq $hash);
    }
    if ($flag == 1){
        print "$hash exist";
    }elsif ($flag == 0){
        print "$hash not exsit";
    }

    # 直接调用现成的exists函数
    if (exists $hash{$hash}){
        print "$hash exist";
    }else{
        print "$hash not exsit";
    }

    如何删除哈希关键字?

    delete $hash{li};

    哈希结构排序

    foreach (sort keys %Words){
        print "$_ $Words{$_}
    ";
    }

     

    第8学时 函数

    • 如何定义函数和调用函数
    • 值传递 和 返回值
    • use strict

    # 创建一个Hello World子例程
    sub HelloWorld{
        print "Hello World!
    ";
    }

    # 调用子例程的两种方法
    &HelloWorld();
    HelloWorld();

    函数能返回所有的数据类型

    # 此例返回数组
    sub shift_to_uppercase{
        @words=qw(li zhi xin);
        foreach (@words){
            $_ = uc($_);
        }
        return(@words);
    }

    函数参数(有点复杂)

    被传递的参数可以通过特殊变量@_来访问。

    sub printargs{
        print join(',', @_);
    }
    printargs('market', 'home', 'roast beef');

    如何访问函数的具体的某个参数?($_[i])

    sub print_third_argument{
        print $_[2];
    }

    作用域

    默认的变量是全局变量。

    为了保证函数的封装性,函数里的变量必须为专用变量,可以使用my操作符(只在当层模块可见)。

    local变量(局部变量)(在当层,以及以内的模块都可用)

     

    use strict

     

    参考:


    Perl程序实例

    join可以将数组(列表)合并为标量(为啥qq生成的数组不行,qw可以)

    @a = ('li', 'zhi', 'xin');
    $b = join("-", @a);

    如何迭代数组和哈希?

    @a = ("li", "zhi", "xin");
    foreach (@a){
        print "$_
    ";
    }
    
    %b = ("a" => "abc", "d" => "def", "e" => "efg");
    foreach (keys %b){
        print "$_ => $b{$_}
    ";
    }

    如何传递参数?

    perl很奇怪,定义函数时没有标志性的圆括号 和 参数列表,以至于初学者不知道如何传递参数。

    其实,参数被传递给了perl的特殊变量 @_ (它是一个列表) (类似于$_):

    sub printargs {
        print join(',', @_);
    }
    printargs("li", "zhi", "xin");

    如何单独访问指定的参数? 使用@_ 数组的下表进行准确操作,但是换了符号,得用 $_[0], $_[1]…

    sub print_third_argument{
        print $_[2];
    }
    print_third_argument("li","zhi","xin");

     

    unless 是 if 的反义词

    -e 等参数用于检查 文件和目录是否存在,以及其他属性。

    <=>飞船运算符如何使用?

    @number=qw/5 10 15 3 2 4 8 6 /;
    my @descending =sort {$a<=>$b} @number;#这里$a=5,$b=10,因为$a在前,perl得到的结果是小数在前,也就是升序排列
    print "@descending
    ";
    # 结果:2 3 4 5 6 8 10 15
    # 如果要降序排列,只要把程序的第二行变成sort{$b<=>$a}就可以了:

  • 相关阅读:
    Mysql锁原理浅谈
    MySQL分库分表浅谈
    MySQL ORDER BY主键id加LIMIT限制走错索引
    表数据量影响MySQL索引选择
    配置supervisor管理beego应用
    9.Element-ui的校验规则Rules
    8.Element-ui日期组件上传到后台日期少一天解决办法
    23.POI导出
    22.访问jar包下资源路径里的文件
    21.Shiro在springboot与vue前后端分离项目里的session管理
  • 原文地址:https://www.cnblogs.com/leezx/p/5607753.html
Copyright © 2020-2023  润新知