zoukankan      html  css  js  c++  java
  • Perl 编程 基础用法

    Perl 编程

    标准头部写法

    #!/usr/bin/perl -w   # 标准的头部写法,-w意为显示警告
    

    变量

    $a=$b+10    # $a和$b都不需要定义,拿过来就用
    

    Note: $flag=0 如果后续未用到,会爆警告

    数组

    1.基本知识
    @array=()  		     # 声明一个空数组		
    $array[1] 		     # 取数组中的第2个值
    $len=@array                  # 取数组的长度
    $#array                      # 取数组最后一位值的下标
    $array [0..4]                # 取数组第1到第5个数
    @array=(1..25)               # 构建一个包含从1到25的数组
    
    print @lines[0..$#lines]     # 将一个数组从第1个到最后一个元素全部打印出来
    
    
    2. 数组操作
    push @array,$i               # 将变量i插入到数组最后
    pop @array                   # 删除最后一个值
    shift @array                 # 弹出数组第一个值(常配合@ARGV)
    
    3.判断两个数组是否相同

    判断每一位是否相同

    $index=0;				
    while($index<@arr1)
    {
    	if($arr1[$index] ne $arr2[$index])
    	{
    	    # to do 
    	}
    	$index++;
    }
    
    4.判断一个字符是否在某个数组中
    $aim = 263;
    if(grep /^$aim$/,@arr1)   # 使用grep判断字符$aim是否在@array中
    {
        print "find
    ";
    }
    
    5.对数组进行排序
    1. 以ASCII进行排序
    @words1=("a","b","A","d","c");
    @words2=("repaaaaaalace", "raplace", "input", "sequence", "of",  "a",  "repaalace",  "character");
    my @newwords1=sort @words1;			#以ASCII进行排序,非字典顺序
    my @newwords2=sort @words2;			
    print "@newwords1
    ";
    print "-----
    ";
    print "@newwords2
    ";
    
    输出:
    A a b c d
    -----
    a character input of raplace repaaaaaalace repaalace sequence
    
    1. 对一个数字型数组排序
    @num=(1,24,35,0);
    my @sorted = sort { $a <=> $b }@num;
    print "@sorted
    ";
    
    输出:
    0 1 24 35
    
    6.合并数组内元素-join

    join函数

    @num=(1,24,35,0);
    my @str = join("-",@num);
    print "@str
    ";
    
    输出:
    1-24-35-0
    

    if语句

    if(条件1 || 条件2 && 条件3)
    {
    
    }elsif(条件)
    {                           # 注意此处为elsif
    
    }else
    {
    
    }
    
    

    条件判断

    eq,ne,gt,le    # 进行字符串比较,前面不带-
    == 和 !=       # 数字匹配
    

    for循环

    # 第一种
    for(my $i;$i<$len;$i=$i+1)
    {
    
    }
    
    # 第二种
    foreach my $i (@array)
    {
    
    }
    

    循环控制

    last;			# 退出循环
    last与next
    
    last  			# 直接跳出循环体   类似break
    next			# 跳出本次循环	    
    exit
    
    exit 0;			# 退出并返回0,也可以直接 exit; 不带返回值
    

    常用函数

    chomp

    $line1=chomp($line) 可用于去除$line中最后的 ,也可以使用正则去掉

    sqrt

    $i=sqrt(100) 开平方

    lc和uc
    lc()			# 将字符全部小写
    uc()			# 将字符全部大写
    
    glob

    glob 函数用于打印作为参数传递给它的目录中存在的文件。此功能可以打印所有或扩展名已传递给它的特定文件

    foreach $file (glob "lyrics/*") {    # 遍历lyrics目录下所有文件
    
    }
    
    rand

    rand(5) 生成一个0-5之间的一个随机float型数,如3.1415926

    int rand(5) 取整,结果为3(接上假设)

    有关输入的重点内容

    获取用户输入

    ./a.pl运行后 ,enter换行, 再次输入的内容使用<>读取

    带有重定向符输入参数使用 <>

    ./digit.pl <1.txt

    • 通过<>或都可以直接将1.txt文件内容读进去

    ./digit.pl hello world <1.txt

    • 使用<>依旧读取的是1.txt的内容,hello world并不会被读入
    • 同时ARGV[2]并未定义,不是<1.txt

    读进去的内容分割成单词加入一个数组

    while ($line = <STDIN>) {
        my @words = split /[^a-zA-Z]+/, $line;
        foreach $word (@words) {
            $count++ if $word ne '';
        }
    }
    
    ,文件做命令行参数

    同一行的输入参数大多用@ARGV和open来读

    同一行输入参数+换行输入参数--使用shift+while(<>)来读

    如果单单使用while(<>)是读取不到7的

    ARGV

    @ARGV   		# 包含外界所有传入参数的一个数组
    $len=@ARGV		# 数组长度
    $ARGV[0]                # 外界传入的第一个参数
    
    例:./echon.pl <t1.txt t2.txt t3.txt
    @ARGV=("t2.txt","t3.txt")       由于第一个参数含有重定向<,所以不会被放入ARGV中
    $len=@ARGV                      是 2
    $ARGV[0]                        是 t2.txt  
    
    ------------
    shift @ARGV			# 将外界输入参数第一位弹出来
    例:  ./digit.pl -5 1.txt
    shift @ARGV                     # 操作之后可以直接对@ARGV进行操作,即操作1.txt
    

    打开并读取文件

    open F,'<',t1.txt or die "$0: Can't open $file: $!
    ";
    将t1.txt打开至 F中,后续可以对<F>进行操作,如@array=<F>
    close F;
    

    打开并写入文件

    print("
    ")     			可以实现换行
    print('
    ')				会把
    打印出来
    print $out $line			注意这种写法,意思为在$out里写入$line(不可以加括号)
    

    字符串一些操作

    获取字符串长度
    length($line)			获取字符串的长度
    
    对字符串进行切片
    $str=substr($line,2,10)	       从第3个字符开始获取$line中总计10个字符(类似切片)
    
    字符串拼合
    $a.="hello world"		字符串相加
    
    切割字符串

    split函数

    my @words=split(/ /,$text);	# 将text中的内容以空格间隔,重新加入数组words中
    例子:
    $line="a b c d 1"
    输出结果:
    @words={a,b,c,d,1}
    

    函数

    sub test{					# test后面不加()
    	my ($test,$test1)=@_;			# @_意为外界传进来的实参,可传多值
    	print($test);
    	return $test+$test1;			# 同样使用return来返回值
    }
    test(1,2);
    

    字典

    哈希(字典)

    %data={'today','818','tomorrow','819','yesterday','817'}      # 通过逗号隔开
    $data{'today'}                      # 读取某一键的值 读取今天,818
    @names = keys %data;                # 读取所有的key
    @values = values %data;             # 读取所有的value
    $data{'thedaybeforeyesterday'}='816';       # 直接赋值即可添加键值对
    delete $data{'today'}                       # 通过delete删除键值
    

    正则匹配

    匹配
    =~                                   # 匹配
    !~				     # 不匹配
    if($i=~/-([0-9]+)/)
    {
    	print($1);		     # 重点知识:$1为正则匹配中第一个括号里内容,$2为第二括号内内容
    }
    //i				     # 匹配忽略大小写
    ----------------------
    $1,$2是只读无法改变的,可使用$num=$1  去进行后续操作
    将匹配结果赋值给另一个值 a=b=~//;
    
    替换
    s///g   		# 替换字符,g表示全局匹配
    
    例:s/[01234]/</gi;	   # 将字符串里所有的01234替换成<
        $i =~ s/[1234]/</gi;   # 将变量i中所有的1234替换成<
        $line =~ s/^s*//;	   # 去掉开头空白格
        $line =~ a/s*$//;	   # 去掉末尾的空白格
    
    补充:	
    w		   # 匹配一个字母、数字或下划线
    d		   # 匹配一个数字,同[0123456789]
    s		   # 匹配一个空格
    [^0-9]             # 匹配纯数字
    [^a-zA-Z]          # 匹配非字母
    
    shell与perl正则匹配的区别
    1. shell是将整个文件读进来,通过某一个关键字匹配去获取一整行内容

    2. perl是将一整个文件逐行读进来,通过匹配来得到一行中某些特定的字段,加上使用group($1)来配合提取某些字段

  • 相关阅读:
    centos7 nfs安装
    Rasa在PyCharm中进行debug
    IOS的? !
    IOS中IndexPath
    移动端文本框点击后网页变大的解决办法
    h5 在全屏iphonex中的适配
    net5中得logging保存到文件中
    SQL SERVER 2000数据库置疑处理
    ILSpy源码下载后,编译不过的问题
    Tigase8.x 搭配Mysql8及以上启动时报错(Nodes redirection table: tig_cluster_nodes doesn't exits)的解决方法
  • 原文地址:https://www.cnblogs.com/HsinTsao/p/15408325.html
Copyright © 2011-2022 走看看