perl 學習筆記

一:基礎vim

1:安裝perlcentos

     centos: yum -y install perl 
     官網:https://www.perl.org/
     升級到5.22:先下載,執行./install.sh 安裝
          報錯:/lib64/libc.so.6: version `GLIBC_2.14' not found (required by perl/bin/perl)
          緣由:編譯時寫死了glibc的版本,而系統中只到2.12 ,因此重裝glibc便可
          解決:查看glibc版本:rpm -qa |grep glibc
                    下載2.14版本:http://ftp.gnu.org/gnu/glibc/  (官網;http://www.gnu.org/software/libc/)
                    安裝:目錄下建立:mkdir build && cd build && ../configure --prefix=/opt/glibc-2.14
                            make -j4  && make install 
            增長環境變量:export LD_LIBRARY_PATH=/opt/glibc-2.14/lib:$LD_LIBRARY_PATH  
                     建軟鏈:mv /lib64/libc.so.6 /lib64/libc.so.6.back  && ln -s /opt/glibc-2.14/lib/libc-2.14.so /lib64/libc.so.6
          安裝perl,替換軟鏈: mv /usr/bin/perl /usr/bin/perl.5.10 && ln -s /opt/ActivePerl-5.22/bin/perl /usr/bin/perl
          安裝過程當中提示有文件找不到,建立它便可
2:第一個perl腳本
     建立文件:vim helloword
                    #!/usr/bin/perl

                    print "Hello , world!\n";數組

     給權限:  chmod a+x helloword
     運行:     ./helloword
 
3:數據類型
     1):數字( perl中的數字都以浮點數值使用
#!/usr/bin/perl
print 1.2;
print 2.000;
print -3;
print -1.2E22;
 
print  12_321_435;#數字,方便查看
 
print  o 377; #八進制
print  ox ff; #十六進制
print  ob 11111111;#二進制
 
print 2+2;
print 2-1.2;
print 1.2 - 3.3;
print  1/3; #內部使用雙精度計算
print 1.0/3;
print 1/2.0;
 
print 10%3;
print 3**3;
 

     2):字符串(使用utf8編碼,文件也需要保存爲utf8格式函數

#!/usr/bin/perl 
use utf8;                             #使用utf8字符集
binmode(STDIN, ':encoding(utf8)');      #使用utf8輸入
binmode(STDOUT, ':encoding(utf8)');     #使用utf8輸出
binmode(STDERR, ':encoding(utf8)');     #使用utf8輸出錯誤
 
print 'gbz is good\n';                  #使用單引號的字符常量
print "gbz is good\n";                  #使用雙引號的字符常量
print "\x{2744}";                       #雙引號的常量自動轉義
 
#perl中的操做符跟據運算符號判斷需要的是什麼類型的值,並會自動轉換
print "he" . " gg\n";                   #.鏈接符
print "he" * 5 ."\n";                   #*算數運算,把he轉爲數字爲0
print "33he" * 2 . "\n";                #33he轉爲數字爲33
print "he" x 4.8;                       #x字符串複製倍數
 
print "he" . 3 * 4 ;                    #先算數運算,在字符運算
 

     3):打印錯誤信息ui

#!/usr/bin/perl -w      打印簡單錯誤信息
use diagnostics;          #打印詳細錯誤信息
 
     4):變量( 未定義表示undef
#!/usr/bin/perl
use utf8
 
$age = undef;
$age2 = undef;
print $age += 1;  #與數字運算時,表示0
print "gbz" . $age2 . "gbz";    #與字符運算時,表示空串
print  defined(undef);    #判斷是否爲undef,是:空,否:1
 
$name = "gbz"; #變量名要有意義
$name_length = length($name); #包括字母下劃線等
print $name;
print " ${name} is size :  $name_length\n";       #字符串中引用盡可能使用${}
 
$ord_name = ord($name);   #一個字符轉換爲碼值
print $ord_name . "is " . chr($ord_name);  #碼值轉字符
 
     5)運算符
          #!/usr/bin/perl
use utf8;
#字符比較符:eq,ne,lt,gt,le,ge
#數字比較符:==,!=,< ,> ,<=,>=
print '1' eq '1';   #字符串比較,true 返回1
print '2' eq '1';   #字符串比較,false 不返回
print 1 == 1;       #數字比較
print 2 == 1;

$name = '\n';
if(''|0|'0'|$name){  #假:空,數字0,字符0
print 'true';
}else{
print 'flase';
}

$line =  <STDIN>;  #用戶輸入流,以回車結束
if($line eq "\n"){
print "this is blank!\n";
}else{
print "not blank: $line";
}

chomp($line);    #去掉末尾回車符,返回1,不然返回0
chomp($line2 = <STDIN>); #先去掉回車,再賦值給變量
print $line2;
$line3 = <STDIN>;
print chomp $line3; # perl方法能夠不用括號

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

     6):列表和數組this

           #!/usr/bin/perl
use utf8;
 
$list[0] = 1;  #數組從0開始
$list[1] = '2'; #能夠存放不一樣類型的值
$list[100] = 100; #建立了101個元素,中間的值爲undef
print $list[0] . '--' . $list[100] . '--' . $list[50] . '--';
print $list[1.22];  #下標去掉小數
print $list[-1];    #最後一個

print "\n";
$list = 111;
print $list; #與數組同名的變量,與數組是不相關的兩個變量
print $list[-22];


($array11,$array12,$array13) = (1,2,3);  #列表建立及賦值
($array21,$array22) = (1..6); #..範圍操做符,把前兩個元素賦值
$array3 = qw ( 1 2 3 ); #使用qw 建立數組
$array4 = qw / 1 2 3 4 '1'/;
print $array11; 
print $array22;
print $array4; #返回最後一個元素

@array = (1.2..5.6); #小數會轉換成整數
print @array; #@表示整個數組
print pop @array;  #取出末尾一個元素
push @array,1..3;  #把1,2,3放到@array末尾
print @array;
print shift @array; #取出第一個元素 
unshift @array,1;   #把1放到開頭
splice @array,1,2,qw(22); #從索引1開始,取出兩個元素,用22替換

$_ = '44'; #$_是perl的默認變量,是全局變量
foreach $_ (@array){ #在循環中$_是局部變量,與全局變量佔用不一樣的存儲空間
     print $_ . "\n";
}  
print $_;#循環外打印的是全局變量的值

print reverse 1..6; #倒序
print sort 5..10,'ss',' ',"\n"; #unicode碼值順序

     7):map(哈希)編碼

          perl中標量,列表,哈希都有各自的命名空間,即便同名也不影響                                                                                                                                  
          map中 key能夠是 數字,字符串,undef;但都會轉爲字符串
          map中 value能夠是 數字,字符串,undef,列表
           建立和取值:
               $map{'name'} = 'gbz';
               $map{ age} = 25;   #key自動轉爲字符串
               $map{1} = undef;
               $map{undef} = 1;
 
               取值:print  $map{undef} ;
               刪除:delete  $map{name};
               key是否存在:print exists $map{names};     #存在:1  ,不存在:undef
           訪問整個map
               print  %map;
          轉換
               list ==>map : %map = (' name',"gbz",' age',25);    #(key , value , key , value)
               map ==>list:  @array = %map;
               胖箭頭:%map = ('name'  => "gbz",'age'  => 25);    #perl自動把=>轉換爲,
           keys  values
                %map = ('name' => "gbz",'age' => 25);
      @k =  keys %map;     #獲得全部key
                @v =  values %map;     #獲得全部value
           遍歷
               while( ($key , $value) = each %map ){
                   print " $key ==> $value";
               }
          讀取環境變量:print "home is  $ENV{ HOME }\n";
 
4:標量上下文和列表上下文(重點)
          在perl中跟據上下文不一樣,獲得的結果也不一樣:
               @ list = qw ('g','b','z');
                @array = sort @list;   #列表上下文,獲得的是g b z 
                $size = 42 + @list;     #標量上下文,獲得的是45
          區分標量仍是列表主要查看錶達式需要什麼類型的數據
          在列表上下文中使用產生標量的表達式:產生一個元素的列表
               @list = 6*7;    # (42)
          強制指定標量上下文:print scalar @list;  #獲得的是元素個數
          列表上下文中的stdin:@lists = <STDIN>; 返回返有行,直到末尾
          標量上下文中的stdin:$list = <STDIN>;返回下一行數據
 
5:子程序(方法或函數)
#!/usr/bin/perl
use utf8;
#use strict; #use 5.012 嚴格編譯檢查,建意開啓
 
sub max {
     $n += 1; #perl默認變量都是全局變量
     print "number is $n\n";
}
 
&max;  #調用自定義方法
&max; 
 
sub max { #會覆蓋同名方法,此時上面的兩個調用的也是被覆蓋的方法
     print "~~~~";
}  
max;    #如可沒有和perl內置方法重名能夠省略&號調用方法
 
sub number {
     $n = 0;
     $n + 3; #默認子程序返回值爲最後一句代碼的值
}  
print &number;
 
sub return_sub {
     1 + 1;
     return 22; #能夠返回列表,標量,undef;     return ; 通常表示程序執行有誤
     1 + 2;
}  
print return_sub;
 
sub unmber_max {
     my($m,$n) = @_;  #my()用來定義私有變量,與方法外同名變量互不影響
     if ($_[0] > $_[1]){ #perl使用@_來接收參數,是私有變量
         $m;                    #也會使用$_[index]數組來接收參數
     }else{
         $n;
     }  
}  
print &unmber_max(19,30);
 
use 5.010; #foreach需要設定版本纔可以使用
sub addlist {
     state @lists;   #私有變量,其值會被保存下來,留給下一次子程序執行時繼續使用
     foreach my $l (@_){
         push @lists,$l;
     }
     say "this list @lists";
}
addlist(1..4);
addlist(2,7);
say @lists; #方法外不能訪問state 定義的變量
 
6:輸入與輸出
     1)讀取標準輸入(while會一行一行的讀;foreach會讀入所有,效率低下)
          while (defined($line = <STDIN>)){
    print "I saw ${line}\n";
}
//簡寫                                                                                                                                  
while (<STDIN>){
    print "I saw $_\n";
}
     2)鑽石操做符輸入(<STDIN>的簡寫)
while (<>){
    chomp;      #默認去掉$_後的換行符
    print "I saw $_\n";
}
調用:./io io  #讀取「文件io」到標準輸入流
     3)標準參數(@ARGV,咱們能夠修改它)
調用: ./io sub 
默認參數存放到 @ARGV 中, <STDIN>依次讀取@ARGV中的數據
     4)標準輸出(<STDON>)
print("out print str");     #輸出到標準輸出流
print "out print str";     #簡寫,去掉括號
print (2+4)*4;       #print (2+4)輸出成功返回1,再乘4
 
printf "hello , %s; in %d days!\n" ,"gbz" , 3;
printf "%g %g %g \n" , 5/2 , 31/17 , 22**33; #數字原樣輸出
printf "截斷,只保留整數部分 %d \n" , 22.334;
printf "||% 6d||% -6d||\n" , 33 , 55;   #正6左補空格,負6右補空格
printf "||%12 .3f||\n" , 43.23525;   #保留3位小數
printf "%.2f%%\n" , 22.45; #百分號
 
use 5.010;
say "gbz" ;  #自動換行功能
 
my @list = qw (22.34 11.542 11.667);
printf "the items  are:\n" .  ("%10.1f\n" x @list), @list;   #至關於%10.1f\n %10.1f\n%10.1f\n 
                                                                                    # ("%10.1f\n" x @list) 標量上下文,@list爲元素個數
     5)文件句柄
    命名:通常大寫
      perl默認的文件句柄:STDIN、STDOUT、STDERR
       打開文件的方式 :
      open CONFIG, 'io'; #讀寫方式打開文件,使用CONFIG訪問 
        open CONFIG, '<io';#只讀方式打開文件   
      open LOG, '>test.io';#覆蓋寫入文件 
           open LOG, '>>test.io';#追加    
    更好的方式:
      open CONFIG, '<' , 'io';#只讀方式打開文件
         open LOG, '>' , 'test.io';#覆蓋寫入文件
      open LOG, '>>' , 'test.io';#追加
    指定編碼:(查看perl支持的:perl -MEncode -le "print for Encode->encodings(':all')")
       open CONFIG, '<:encoding(UTF-8)' , 'io';
            或:open LOG, '>:utf8' , 'test.io';   
           一勞永逸(指定全部輸入爲utf8):binmode STDIN, ':encoding(UTF-8)';
    有問題的文件句柄:
            open 命令打開文件成功:返回真
                                        失敗:返回假 
    輸出錯誤:
      終止程序:die "error :  $!";   #perl默認使用$!存放錯誤信息,會放到標準錯誤流中
                 不終止:warn "error : $!";
                 自動檢錯:use autodie;
    關閉句柄:(perl會在程序關閉或從新使用前關閉句柄)
            close LOG;     
    使用文件句柄:
open CONFIG, '<io';
while (<CONFIG>){
    chomp;
    print $_;
}

    改變輸出句柄:spa

      select LOG;     #默認輸出如今爲LOG
      $| = 1;            #不緩衝直接輸出
        select STDOUT; #還原
       重定向句柄失敗後,perl還使用以前的
    包柄存到標量變量中:
        open my $log_fh, '>','io.txt' or die "error : $! \n";  #打開文件,有錯誤會報錯
        print {$log_fh} "gbz";   #輸入到文件中
        while (<$log_fh>){  #讀取,'>' 換成 ‘<’    
            chomp;    
            print $_;
        }
相關文章
相關標籤/搜索