乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Perl 筆記

       印度阿三17 2020-02-28


      常用記錄

      chop與chomp的區(qū)別

      • chop()函數(shù),只是去除最后一個(gè)字符

      • chomp()函數(shù),就要首先判斷最后一個(gè)字符是不是為"\n",他才去除。

      變量初值

      對(duì)于沒(méi)有賦初值的scaler,默認(rèn)初始為空,但若參與運(yùn)算,則當(dāng)作0處理。

      $x = $ff   1;
      print("$x\n");
      print("$ff\n");
      1

      這里沒(méi)有對(duì)ff定義,但x的值print出來(lái)是1,說(shuō)明ff在參與運(yùn)算時(shí)是0;但運(yùn)算后其值并沒(méi)有改變,還是空。

      多行注釋

      =pod
      codes to comment
      =cut

      正則匹配注意事項(xiàng)

      1. =~ 匹配時(shí),等號(hào)和~符號(hào)之間不能有空格!,否則輸出一串怪異數(shù)字。

      lc和uc

      $side = uc $attrs[0];  把a(bǔ)ttrs[0]轉(zhuǎn)換成大寫(xiě),然后給side變量賦值。
      $gender = lc $attrs[1]; 把a(bǔ)ttrs[1]轉(zhuǎn)換成小寫(xiě),然后給gender賦值。

      split 產(chǎn)生空元素

      在按照/ /或者/\s /來(lái)split字符串時(shí),常會(huì)遇到莫名其妙多出來(lái)一個(gè)空元素的問(wèn)題。

      這是因?yàn)槿绻址_(kāi)頭就是空格,split會(huì)把開(kāi)頭的前導(dǎo)空白符(一個(gè)空字符)也算作一個(gè)元素。

      如果要按照空格來(lái)split,有幾種方法:

      1. split ' '或者直接用默認(rèn)形式split,不加任何東西

        • split ' '是split的特殊情況,該格式是模擬awk的默認(rèn)行為,所以在分割行為開(kāi)始之前,會(huì)把字符串中的前導(dǎo)空格全部刪除,然后再使用split /\s /處理。

      2. 刪除前導(dǎo)空白符,再用split(/\s /,$_);

        • $_ =~ s/^\s //; ## 丟棄前導(dǎo)空白符 $_ =~ s/\s $//; ## 丟棄末尾空白符

      基礎(chǔ)

      1. 運(yùn)行perl

      • 文件頂部加 #!/usr/bin/perl

      • 加權(quán)限 chmod u x file.pl 或者chmod 0755 file.pl

      • ./file.pl

      2. 字符串

      字符串連接符

      $str = "hello" . "world";       # 字符串連接
      $num = 5   10;                  # 兩數(shù)相加
      $mix = $str . $num;             # 連接字符串和數(shù)字

      轉(zhuǎn)義符

      轉(zhuǎn)義字符含義
      \t水平制表符(4空格)
      \u強(qiáng)制下一個(gè)字符為大寫(xiě)
      \l強(qiáng)制下一個(gè)字符為小寫(xiě)
      \U強(qiáng)制將所有字符轉(zhuǎn)換為大寫(xiě)
      \L強(qiáng)制將所有的字符轉(zhuǎn)換為小寫(xiě)
      \Q將到\E為止的非單詞(non-word)字符加上反斜線
      \E結(jié)束\L、\U、\Q

      qq

      • qq(string in qq):相當(dāng)于”string in qq”

      • q(string in q): 相當(dāng)于’string in q’

      • ( )可換為<>,{ },[ ]等配對(duì)字符 qq{string in qq};

      here文檔

      示例:

      #!/usr/bin/perl
       
      $a = 10;
      $var = <<"EOF";
      這是一個(gè) Here 文檔實(shí)例,使用雙引號(hào)。
      可以在這輸如字符串和變量。
      例如:a = $a
      EOF
      print "$var\n";

      輸出:

      這是一個(gè) Here 文檔實(shí)例,使用雙引號(hào)。
      可以在這輸如字符串和變量。
      例如:a = 10

      $a=<< “EOF” 的意思就是說(shuō):下一行開(kāi)始,直到遇見(jiàn)“EOF”為止,所有的字符都按照指定的格式存入變量a中。你可以用EEE,MAMA等等其他的名字都可以。

      多行字符串

      #!/usr/bin/perl
      $string = '
      菜鳥(niǎo)教程
          —— 學(xué)的不僅是技術(shù),更是夢(mèng)想!
      ';
      print "$string\n";

      也可以用here文檔

      特殊字符

      # __FILE__, __LINE__, 和 __PACKAGE__ 分別表示當(dāng)前執(zhí)行腳本的文件名,行號(hào),包名
      文件名 test.pl
      行號(hào) 4
      包名 main

      v 字符串

      一個(gè)以 v 開(kāi)頭,后面跟著一個(gè)或多個(gè)用句點(diǎn)分隔的整數(shù),會(huì)被當(dāng)作一個(gè)字串文本。將整數(shù)轉(zhuǎn)換為對(duì)應(yīng)的ASCII碼字符。

      $foo    = v102.111.111; # 代表foo
      $martin = v77.97.114.116.105.110; # 代表Martin

      3. 變量

      1. 標(biāo)量:$myfirst=123;

      2. 數(shù)組:@arr=(1,2,3) ,索引用$arr[0]

      3. 哈希:%h=('a'=>1,'b'=>2); 索引用$h{'a'}

      數(shù)據(jù)類型
      1. 整形:$x = 12345; 實(shí)際是浮點(diǎn)數(shù)的特例

      • 8 進(jìn)制和 16 進(jìn)制數(shù):8 進(jìn)制以 0 開(kāi)始,16 進(jìn)制以 0x 開(kāi)始。

      1. 浮點(diǎn)數(shù):11.4 、 -0.3 、.3 、 3. 、 54.1e 02 、 5.41e03。

        • 浮點(diǎn)寄存器通常不能精確地存貯浮點(diǎn)數(shù),從而產(chǎn)生誤差,在運(yùn)算和比較中要特別注意。指數(shù)的范圍通常為 -309 到 308

      2. 字符串: 見(jiàn)上面

      變量上下文

      Perl 解釋器會(huì)根據(jù)上下文來(lái)決定變量的類型。實(shí)例如下:

      #!/usr/bin/perl
       
      @names = ('google', 'runoob', 'taobao');
       
      @copy = @names;   # 復(fù)制數(shù)組
      $size = @names;   # 數(shù)組賦值給標(biāo)量,返回?cái)?shù)組元素個(gè)數(shù)
      數(shù)組
      創(chuàng)建數(shù)組:括號(hào)或者qw
      @array = (1, 2, 'Hello');
      @array = qw/這是 一個(gè) 數(shù)組/;
      @days = qw/google #qw支持多行定義數(shù)組
      taobao
      runoob/;
      # 可以按索引給數(shù)組賦值
      $array[6] = 'Sunday'; # 允許索引超出定義的長(zhǎng)度
      數(shù)組序列號(hào)
      @var_10 = (1..10);
      @var_20 = (10..20);
      @var_abc = (a..z);
       
      print "@var_10\n";   # 輸出 1 到 10
      print "@var_20\n";   # 輸出 10 到 20
      print "@var_abc\n";  # 輸出 a 到 z
      數(shù)組大小

      $size = @array;

      返回的是數(shù)組長(zhǎng)度,不是元素個(gè)數(shù)。

      添加和刪除數(shù)組元素
      序號(hào)類型和描述
      1push @ARRAY, LIST 將列表的值放到數(shù)組的末尾
      2pop @ARRAY 刪除數(shù)組的最后一個(gè)值
      3shift @ARRAY 彈出數(shù)組第一個(gè)值,并返回它。數(shù)組的索引值也依次減一。
      4unshift @ARRAY, LIST 將列表放在數(shù)組前面,并返回新數(shù)組的元素個(gè)數(shù)。
      #!/usr/bin/perl
      # 創(chuàng)建一個(gè)簡(jiǎn)單是數(shù)組
      @sites = ("google","runoob","taobao");
      $new_size = @sites ;
      print "1. \@sites  = @sites\n"."原數(shù)組長(zhǎng)度 :$new_size\n";
      # 在數(shù)組結(jié)尾添加一個(gè)元素
      $new_size = push(@sites, "baidu");
      print "2. \@sites  = @sites\n"."新數(shù)組長(zhǎng)度 :$new_size\n";
       
      # 在數(shù)組開(kāi)頭添加一個(gè)元素
      $new_size = unshift(@sites, "weibo");
      print "3. \@sites  = @sites\n"."新數(shù)組長(zhǎng)度 :$new_size\n";
       
      # 刪除數(shù)組末尾的元素
      $new_byte = pop(@sites);
      print "4. \@sites  = @sites\n"."彈出元素為 :$new_byte\n";
       
      # 移除數(shù)組開(kāi)頭的元素
      $new_byte = shift(@sites);
      print "5. \@sites  = @sites\n"."彈出元素為 :$new_byte\n";
      切割索引
      #!/usr/bin/perl
      @sites = qw/google taobao runoob weibo qq facebook 網(wǎng)易/;
      @sites2 = @sites[3,4,5];
      # 輸出:weibo qq facebook
      # 連續(xù)索引也可以用..:
      @sites2 = @sites[3..5];
      替換數(shù)組元素

      Perl 中數(shù)組元素替換使用 splice() 函數(shù):

      splice @ARRAY, OFFSET [ , LENGTH [ , LIST ] ]

      @nums = (1..20);
      print "替換前 - @nums\n";
      #從第6個(gè)元素開(kāi)始替換數(shù)組中的5個(gè)元素:
      splice(@nums, 5, 5, 21..25); 
      print "替換后 - @nums\n";
      
      #替換前 - 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
      #替換后 - 1 2 3 4 5 21 22 23 24 25 11 12 13 14 15 16 17 18 19 20
      將字符串轉(zhuǎn)換為數(shù)組

      split [ PATTERN [ , EXPR [ , LIMIT ] ] ]

      • PATTERN:分隔符,默認(rèn)為空格。

      • EXPR:指定字符串?dāng)?shù)。

      • LIMIT:如果指定該參數(shù),則返回該數(shù)組的元素個(gè)數(shù)。

      # 定義字符串
      $var_test = "runoob";
      $var_string = "www-runoob-com";
      $var_names = "google,taobao,runoob,weibo";
       
      # 字符串轉(zhuǎn)為數(shù)組
      @test = split('', $var_test);
      @string = split('-', $var_string);
      @names  = split(',', $var_names);
       
      print "$test[3]\n";  # 輸出 o
      print "$string[2]\n";  # 輸出 com
      print "$names[3]\n";   # 輸出 weibo
      將數(shù)組轉(zhuǎn)換為字符串

      Perl 中將數(shù)組轉(zhuǎn)換為字符串使用 join() 函數(shù),語(yǔ)法格式如下:

      • join EXPR, LIST

      # 數(shù)組轉(zhuǎn)為字符串
      $string1 = join( '-', @string );
      $string2 = join( ',', @names );
      數(shù)組排序

      Perl 中數(shù)組排序使用 sort() 函數(shù),語(yǔ)法格式如下:

      • sort [ SUBROUTINE ] LIST

      # 定義數(shù)組
      @sites = qw(google taobao runoob facebook);
      print "排序前: @sites\n";
       
      # 對(duì)數(shù)組進(jìn)行排序
      @sites = sort(@sites);
      # 排序后: facebook google runoob taobao
      特殊變量: $[

      特殊變量 \([** 表示數(shù)組的第一索引值,一般都為 0 ,如果我們將 **\)[ 設(shè)置為 1,則數(shù)組的第一個(gè)索引值即為 1,第二個(gè)為 2,以此類推。不推薦,新版中已經(jīng)被廢棄

      合并數(shù)組
      @numbers = (1,3,(4,5,6)); 
      print "numbers = @numbers\n"; #numbers = 1 3 4 5 6
      哈希
      創(chuàng)建hash
      1. $data{'google'} = 'google.com';

      2. 通過(guò)列表設(shè)置, 列表中第一個(gè)元素為 key,第二個(gè)為 value。

      ?ta = ('google', 'google.com', 'runoob', 'runoob.com', 'taobao', 'taobao.com');
      ?ta = ('google'=>'google.com', 'runoob'=>'runoob.com', 'taobao'=>'taobao.com');

      或者用-代替'':

      ?ta = (-google=>'google.com', -runoob=>'runoob.com', -taobao=>'taobao.com');

      但這種方式的key不能出現(xiàn)空格,讀取時(shí):

      $val = $data{-google}
      $val = $data{-runoob}
      讀取哈希值

      @array = @data{-taobao, -runoob};

      讀取所有key

      @names = keys ?ta;

      讀取所有value

      @urls = values ?ta;

      檢測(cè)元素是否存在

      如果你在哈希中讀取不存在的 key/value 對(duì) ,會(huì)返回 undefined 值,且在執(zhí)行時(shí)會(huì)有警告提醒。為了避免這種情況,我們可以使用 exists 函數(shù)來(lái)判斷key是否存在

      if( exists($data{'facebook'} ) ){}
      else{}
      哈希中添加或刪除元素
      # 添加元素
      $data{'facebook'} = 'facebook.com';
      # 刪除哈希中的元素
      delete $data{'taobao'};

      4. 條件

      1. if() {} elsif {} else {}

      2. use Switch;
        $var = 10;
        @array = (10, 20, 30);
        %hash = ('key1' => 10, 'key2' => 20);
        switch($var){
           case 10    { print "數(shù)字 10\n" }
           case "a"   { print "字符串 a" }
           case [1..10] { print "數(shù)字在列表中" }
           case (\@array){ print "數(shù)字在數(shù)組中" }
           case (\%hash) { print "在哈希中" }
           else        { print "沒(méi)有匹配的條件" }
        }

        其中@array 和%hash可以判斷var的值是否在列表或者h(yuǎn)ash內(nèi)。

        另外,還可以在case中加上next, case還會(huì)匹配下面其他的是否滿足:

        2. case 10    { print "數(shù)字 10\n"; next; }  # 匹配后繼續(xù)執(zhí)行
      3. 三元運(yùn)算符

        Exp1 ? Exp2 : Exp3;

        $status = ($favorite > 60 )? "熱門網(wǎng)站" : "不是熱門網(wǎng)站";

      5. 循環(huán)

      while () {}

      條件為真時(shí)循環(huán)

      until () {}

      條件為假時(shí)循環(huán)

      for( ; ; )

      for( $a = 0; $a < 10; $a = $a   1 ){
          print "a 的值為: $a\n";
      }

      foreach

      循環(huán)列表或者集合變量值

      @list = (2, 12, 36, 42, 51);
      # 執(zhí)行foreach 循環(huán)
      foreach $a (@list){
          print "a 的值為: $a\n";
      }

      do...while...

      do{
         statement(s);
      }while( condition );

      循環(huán)控制

      next

      next 語(yǔ)句用于停止執(zhí)行從next語(yǔ)句的下一語(yǔ)句開(kāi)始到循環(huán)體結(jié)束標(biāo)識(shí)符之間的語(yǔ)句,轉(zhuǎn)去執(zhí)行continue語(yǔ)句塊,然后再返回到循環(huán)體的起始處開(kāi)始執(zhí)行下一次循環(huán)。

      $a = 10;
      while( $a < 20 ){
         if( $a == 15)
         {
             # 跳出迭代
             $a = $a   1;
             next;
         }
         print "a 的值為: $a\n";
         $a = $a   1;
      }
      # 輸出結(jié)果會(huì)跳過(guò)15
      last

      Perl last 語(yǔ)句用于退出循環(huán)語(yǔ)句塊,從而結(jié)束循環(huán),last語(yǔ)句之后的語(yǔ)句不再執(zhí)行,continue語(yǔ)句塊也不再執(zhí)行。

      continue

      Perl continue 塊通常在條件語(yǔ)句再次判斷前執(zhí)行。continue 語(yǔ)句可用在 while 和 foreach 循環(huán)中。

      $a = 0;
      while($a < 3){
         print "a = $a\n";
      }continue{
         $a = $a   1;
      }
      # 輸出
      a = 0
      a = 1
      a = 2
      
      @list = (1, 2, 3, 4, 5);
      foreach $a (@list){
         print "a = $a\n";
      }continue{
         last if $a == 4;
      }
      # 輸出
      a = 1
      a = 2
      a = 3
      a = 4
      redo

      Perl redo 語(yǔ)句直接轉(zhuǎn)到循環(huán)體的第一行開(kāi)始重復(fù)執(zhí)行本次循環(huán),redo語(yǔ)句之后的語(yǔ)句不再執(zhí)行,continue語(yǔ)句塊也不再執(zhí)行。

      $a = 0;
      while($a < 10){
         if( $a == 5 ){
            $a = $a   1;
            redo;
         }
         print "a = $a\n";
      }continue{
         $a = $a   1;
      }
      # 輸出
      a = 0
      a = 1
      a = 2
      a = 3
      a = 4
      a = 6
      a = 7
      a = 8
      a = 9
      goto

      Perl 有三種 goto 形式:got LABLE,goto EXPR,和 goto &NAME.

      goto label:

      $a = 10;
      LOOP:do
      {
          if( $a == 15){
             # 跳過(guò)迭代
             $a = $a   1;
             # 使用 goto LABEL 形式
             print "跳出輸出 \n";
             goto LOOP;
             print "這一句不會(huì)被執(zhí)行 \n";
          }
          print "a = $a\n";
          $a = $a   1;
      }while( $a < 20 );

      goto expr:

      $a = 10;
      $str1 = "LO";
      $str2 = "OP";
       
      LOOP:do
      {
          if( $a == 15){
             # 跳過(guò)迭代
             $a = $a   1;
             # 使用 goto EXPR 形式
             goto $str1.$str2;    # 類似 goto LOOP
          }
          print "a = $a\n";
          $a = $a   1;
      }while( $a < 20 );

      6. 運(yùn)算符

      基本運(yùn)算符

      數(shù)字的比較: $a=10,$b=20

      運(yùn)算符描述實(shí)例
      <=>檢查兩個(gè)操作數(shù)的值是否相等, 如果左邊的數(shù)小于右邊的數(shù)返回 -1,如果相等返回 0, 如果左邊的數(shù)大于右邊的數(shù)返回 1 。($a <=> $b) 返回 -1。

      字符串比較: $a="abc", $b = "xyz"

      運(yùn)算符描述實(shí)例
      lt檢查左邊的字符串是否小于右邊的字符串,如果是返回 true,否則返回 false。($a lt $b) 返回 true。
      gt檢查左邊的字符串是否大于右邊的字符串,如果是返回 true,否則返回 false。
      le檢查左邊的字符串是否小于或等于右邊的字符串,如果是返回 true,否則返回 false。($a le $b) 返回 true
      ge檢查左邊的字符串是否大于或等于右邊的字符串,如果是返回 true,否則返回 false。($a ge $b) 返回 false。
      eq檢查左邊的字符串是否等于右邊的字符串,如果是返回 true,否則返回 false。($a eq $b) 返回 false。
      ne檢查左邊的字符串是否不等于右邊的字符串,如果是返回 true,否則返回 false。($a ne $b) 返回 true
      cmp如果左邊的字符串大于右邊的字符串返回 1,如果相等返回 0,如果左邊的字符串小于右邊的字符串返回 -1。($a cmp $b) 返回 -1。

      支持:

      • =

      • 位運(yùn)算符

      • 邏輯運(yùn)算符,and ,&& ,or ,|| ,not

      引號(hào)運(yùn)算符

      運(yùn)算符描述實(shí)例
      q{ }為字符串添加單引號(hào)q{abcd} 結(jié)果為 'abcd'
      qq{ }為字符串添加雙引號(hào)qq{abcd} 結(jié)果為 "abcd"
      qx{ }為字符串添加反引號(hào)qx{abcd} 結(jié)果為 abcd

      其他運(yùn)算符

      運(yùn)算符描述實(shí)例
      .點(diǎn)號(hào) (.) 用于連接兩個(gè)字符串。如果 $a="run", $b="oob" , \(a.\)b 結(jié)果為 "runoob"
      xx 運(yùn)算符返回字符串重復(fù)的次數(shù)。('-' x 3) 輸出為 ---。
      .... 為范圍運(yùn)算符。(2..5) 輸出結(jié)果為 (2, 3, 4, 5)

      自增運(yùn)算符,整數(shù)值增加 1$a =10, $a will 輸出為 11
      --自減運(yùn)算符,整數(shù)值減少 1$a =10, $a-- 輸出為 9
      ->箭號(hào)用于指定一個(gè)類的方法\(obj->\)a 表示對(duì)象 $obj 的 $a 方法。

      運(yùn)算符優(yōu)先級(jí)

      運(yùn)算符符結(jié)合性
      , --無(wú)
      -, ~, !從右到左
      **從右到左
      =~, !~從左到右
      *, /, %, x從左到右
      , -, .從左到右
      <<, >>從左到右
      -e, -r,無(wú)
      <, <=, >, >=, lt, le, gt, ge從左到右
      ==, !=, <=>, eq, ne, cmp從左到右
      &從左到右
      |, ^從左到右
      &&從左到右
      ||從左到右
      ..從左到右
      ? and :從右到左
      =, =, -=, *=,從右到左
      其他
      ,從左到右
      not從左到右
      and從左到右
      or, xor從左到右

      7. 時(shí)間日期

      Perl中處理時(shí)間的函數(shù)有如下幾種:

      • 1、time() 函數(shù):返回從1970年1月1日起累計(jì)的秒數(shù)

      • 2、localtime() 函數(shù):獲取本地時(shí)區(qū)時(shí)間

      • 3、gmtime() 函數(shù): 獲取格林威治時(shí)間

      @months = qw( 一月 二月 三月 四月 五月 六月 七月 八月 九月 十月 十一月 十二月 );
      @days = qw(星期天 星期一 星期二 星期三 星期四 星期五 星期六);
       
      ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime();
      print "$mday $months[$mon] $days[$wday]\n";
      #輸出
      12 六月 星期天
      $datestring = localtime();
      print "時(shí)間日期為:$datestring\n";
      #輸出
      時(shí)間日期為:Sun Jun 12 11:27:31 2016

      求運(yùn)行時(shí)間

      新紀(jì)元時(shí)間(Epoch Time)

      我們可以使用 time() 函數(shù)來(lái)獲取新紀(jì)元時(shí)間,該函數(shù)返回從1970年1月1日起累計(jì)的秒數(shù)。

      一般可以用來(lái)求程序運(yùn)行的時(shí)間。

      $epoc = time();
      ...
      $epoc1 = time();
      $run_time = $epoc1-$epoc;

      POSIX 函數(shù) strftime()

      函數(shù) strftime() 可以將時(shí)間格式化為我們想要的格式。

      use POSIX qw(strftime);
       
      $datestring = strftime "%Y-%m-%d %H:%M:%S", localtime;
      printf("時(shí)間日期 - $datestring\n");
       
      #  GMT 格式化時(shí)間日期
      $datestring = strftime "%Y-%m-%d %H:%M:%S", gmtime;
      printf("時(shí)間日期 - $datestring\n");
      時(shí)間日期 - 2016-06-12 12:15:13
      時(shí)間日期 - 2016-06-12 04:15:13

      8. 子程序(函數(shù))

      子程序傳參

      Perl 子程序可以和其他編程一樣接受多個(gè)參數(shù),子程序參數(shù)使用特殊數(shù)組 @_ 標(biāo)明。因此子程序第一個(gè)參數(shù)為 $_[0], 第二個(gè)參數(shù)為 $_[1], 以此類推。

       # 定義求平均值函數(shù)
      sub Average{
         # 獲取所有傳入的參數(shù)
         $n = scalar(@_);
         $sum = 0;
       
         foreach $item (@_){
            $sum  = $item;
         }
         $average = $sum / $n;
         print '傳入的參數(shù)為 : ',"@_\n";           # 打印整個(gè)數(shù)組
         print "第一個(gè)參數(shù)值為 : $_[0]\n";         # 打印第一個(gè)參數(shù)
         print "傳入?yún)?shù)的平均值為 : $average\n";  # 打印平均值
      }
       
      # 調(diào)用函數(shù)
      Average(10, 20, 30);

      向函數(shù)傳遞列表

      # 定義函數(shù)
      sub PrintList{
         my @list = @_;
         print "列表為 : @list\n";
      }
      $a = 10;
      @b = (1, 2, 3, 4);
       
      # 列表參數(shù)
      PrintList($a, @b);
      列表為 : 10 1 2 3 4

      相函數(shù)傳遞哈希

      # 方法定義
      sub PrintHash{
         my (%hash) = @_;
       
         foreach my $key ( keys %hash ){
            my $value = $hash{$key};
            print "$key : $value\n";
         }
      }
      %hash = ('name' => 'runoob', 'age' => 3);
       
      # 傳遞哈希
      PrintHash(%hash);

      子程序返回值

      如果沒(méi)有使用 return 語(yǔ)句,則子程序的最后一行語(yǔ)句將作為返回值。

      # 方法定義
      sub add_a_b{
         # 不使用 return
         $_[0] $_[1];  
       
         # 使用 return
         # return $_[0] $_[1];  
      }
      print add_a_b(1, 2)

      子程序的私有變量

      • 默認(rèn)情況下,Perl 中所有的變量都是全局變量,這就是說(shuō)變量在程序的任何地方都可以調(diào)用。如果我們需要設(shè)置私有變量,可以使用 my 操作符來(lái)設(shè)置。

      • my 操作符用于創(chuàng)建詞法作用域變量,通過(guò) my 創(chuàng)建的變量,存活于聲明開(kāi)始的地方,直到閉合作用域的結(jié)尾。

      • 閉合作用域指的可以是一對(duì)花括號(hào)中的區(qū)域,可以是一個(gè)文件,也可以是一個(gè) if, while, for, foreach, eval字符串。

      # 全局變量
      $string = "Hello, World!";
       
      # 函數(shù)定義
      sub PrintHello{
         # PrintHello 函數(shù)的私有變量
         my $string;
         $string = "Hello, Runoob!";
         print "函數(shù)內(nèi)字符串:$string\n";
      }
      # 調(diào)用函數(shù)
      PrintHello();
      print "函數(shù)外字符串:$string\n";
      函數(shù)內(nèi)字符串:Hello, Runoob!
      函數(shù)外字符串:Hello, World!

      變量的臨時(shí)賦值

      我們可以使用 local 為全局變量提供臨時(shí)的值,在退出作用域后將原來(lái)的值還回去。local 定義的變量不存在于主程序中,但存在于該子程序和該子程序調(diào)用的子程序中。定義時(shí)可以給其賦值

      # 全局變量
      $string = "Hello, World!";
       
      sub PrintRunoob{
         # PrintHello 函數(shù)私有變量
         local $string;
         $string = "Hello, Runoob!";
         # 子程序調(diào)用的子程序
         PrintMe();
         print "PrintRunoob 函數(shù)內(nèi)字符串值:$string\n";
      }
      sub PrintMe{
         print "PrintMe 函數(shù)內(nèi)字符串值:$string\n";
      }
       
      sub PrintHello{
         print "PrintHello 函數(shù)內(nèi)字符串值:$string\n";
      }
       
      # 函數(shù)調(diào)用
      PrintRunoob();
      PrintHello();
      print "函數(shù)外部字符串值:$string\n";
      PrintMe 函數(shù)內(nèi)字符串值:Hello, Runoob!
      PrintRunoob 函數(shù)內(nèi)字符串值:Hello, Runoob!
      PrintHello 函數(shù)內(nèi)字符串值:Hello, World!
      函數(shù)外部字符串值:Hello, World!

      靜態(tài)變量

      use feature 'state';
       
      sub PrintCount{
         state $count = 0; # 初始化變量
       
         print "counter 值為:$count\n";
         $count  ;
      }
       
      for (1..5){
         PrintCount();
      }
      counter 值為:0
      counter 值為:1
      counter 值為:2
      counter 值為:3
      counter 值為:4

      注1:state僅能創(chuàng)建閉合作用域?yàn)樽映绦騼?nèi)部的變量。

      注2:state是從Perl 5.9.4開(kāi)始引入的,所以使用前必須加上 use。

      注3:state可以聲明標(biāo)量、數(shù)組、哈希。但在聲明數(shù)組和哈希時(shí),不能對(duì)其初始化(至少Perl 5.14不支持)。

      子程序調(diào)用上下文

      子程序調(diào)用過(guò)程中,會(huì)根據(jù)上下文來(lái)返回不同類型的值,比如以下 localtime() 子程序,在標(biāo)量上下文返回字符串,在列表上下文返回列表:

      # 標(biāo)量上下文
      my $datestring = localtime( time );
      print $datestring;
       
      print "\n";
       
      # 列表上下文
      ($sec,$min,$hour,$mday,$mon, $year,$wday,$yday,$isdst) = localtime(time);
      printf("%d-%d-%d %d:%d:%d",$year 1990,$mon 1,$mday,$hour,$min,$sec);
       
      print "\n";
      Sun Jun 12 15:58:09 2016
      2106-6-12 15:58:9

      my 和 local 的區(qū)別

      內(nèi)部 -> 外部:

      • (1)my 和 local 都只在一個(gè) block 里有效,出去就失效;

      • (2)但是 local 的變量可以繼續(xù)在這個(gè) block 中調(diào)用的子程序中存在;

      • (3)如果有與外界同名的變量,兩者在 block 退出后都不影響外界同名變量;

      外部 -> 內(nèi)部:

      (1)外部設(shè)置 my、local、缺省均隊(duì)內(nèi)有效,但是同名變量外部 my,在 block 內(nèi)部 local 是不允許的。因?yàn)槎咴?block 中調(diào)用的子程序中均有效,會(huì)沖突。

      (2)如果在一個(gè) block 中有一個(gè) my 修飾的變量和外界的一個(gè)變量同名,而且又需要在這個(gè) block 中使用外界變量時(shí),兩個(gè)辦法:

      • 第一個(gè)辦法,用 main 的 package 修飾這個(gè)變量名 $main::global。

      • 第二個(gè)辦法,用 our 修飾 our $global,那么該 block 中接下來(lái)出現(xiàn)的所有 $global 都是外界的 global。

      (3)編寫(xiě)腳本時(shí),注意作用域,防止外部影響內(nèi)部。

      9. 引用

      引用就是指針,Perl 引用是一個(gè)標(biāo)量類型可以指向變量、數(shù)組、哈希表(也叫關(guān)聯(lián)數(shù)組)甚至子程序,可以應(yīng)用在程序的任何地方。

      定義變量的時(shí)候,在變量名前面加個(gè),就得到了這個(gè)變量的一個(gè)引用

      $scalarref = \$foo;     # 標(biāo)量變量引用
      $arrayref  = \@ARGV;    # 列表的引用
      $hashref   = \%ENV;     # 哈希的引用
      $coderef   = \&handler; # 子過(guò)程引用
      $globref   = \*foo;     # GLOB句柄引用

      在數(shù)組中我們可以用匿名數(shù)組引用,使用 [] 定義:

      $aref= [ 1,"foo",undef,13 ];

      匿名數(shù)組的元素仍然可以是匿名數(shù)組,所以我們可以用這種方法構(gòu)造數(shù)組的數(shù)組,可以構(gòu)造任意維度的數(shù)組。

      my $aref = [
              [1, 2, 3],
              [4, 5, 6],
              [7, 8, 9],
      ]

      訪問(wèn)的時(shí)候用引用訪問(wèn):

      $aref->[0]->[0] 或者

      $aref->[0][0]"

      哈希中我們可以用匿名哈希引用,使用 {} 定義:

      $href= { APR =>4, AUG =>8 };

      我們也可以創(chuàng)建一個(gè)沒(méi)有子程序名的匿名子程序引用:

      $coderef = sub { print "Runoob!\n" };

      取消引用

      取消引用可以根據(jù)不同的類型使用 $, @ 或 % 來(lái)取消,實(shí)例如下:

      $var = 10;
       
      # $r 引用 $var 標(biāo)量
      $r = \$var;
       
      # 輸出本地存儲(chǔ)的 $r 的變量值
      print "$var 為 : ", $$r, "\n";
       
      @var = (1, 2, 3);
      # $r 引用  @var 數(shù)組
      $r = \@var;
      # 輸出本地存儲(chǔ)的 $r 的變量值
      print "@var 為: ",  @$r, "\n";
       
      %var = ('key1' => 10, 'key2' => 20);
      # $r 引用  %var 數(shù)組
      $r = \%var;
      # 輸出本地存儲(chǔ)的 $r 的變量值
      print "\%var 為 : ", %$r, "\n";
      10 為 : 10
      1 2 3 為: 123
      \%var 為 : key110key220

      判斷變量類型

      ref 來(lái)判斷: ref($r)

      引用函數(shù)

      • 函數(shù)引用格式: &

      • 調(diào)用引用函數(shù)格式: & 創(chuàng)建的引用名。

      # 函數(shù)定義
      sub PrintHash{
         my (%hash) = @_;
         
         foreach $item (%hash){
            print "元素 : $item\n";
         }
      }
      %hash = ('name' => 'runoob', 'age' => 3);
       
      # 創(chuàng)建函數(shù)的引用
      $cref = \&PrintHash;
       
      # 使用引用調(diào)用函數(shù)
      &$cref(%hash);

      10. 格式化輸出

      Perl 中可以使用 format 來(lái)定義一個(gè)模板,然后使用 write 按指定模板輸出數(shù)據(jù)。

      format FormatName =
      fieldline
      value_one, value_two, value_three
      fieldline
      value_one, value_two
      .

      參數(shù)解析:

      • FormatName :格式化名稱。

      • fieldline :一個(gè)格式行,用來(lái)定義一個(gè)輸出行的格式,類似 @,^,<,>,| 這樣的字符。

      • value_one,value_two…… :數(shù)據(jù)行,用來(lái)向前面的格式行中插入值,都是perl的變量。

      • . :結(jié)束符號(hào)。

      $text = "google runoob taobao";
      format STDOUT =
      first: ^<<<<<  # 左邊對(duì)齊,字符長(zhǎng)度為6
          $text
      second: ^<<<<< # 左邊對(duì)齊,字符長(zhǎng)度為6
          $text
      third: ^<<<< # 左邊對(duì)齊,字符長(zhǎng)度為5,taobao 最后一個(gè) o 被截?cái)?    $text  
      .
      write
      first: google
      second: runoob
      third: taoba
      • 格式行以 @ 或者 ^ 開(kāi)頭,這些行不作任何形式的變量代換。

      • @ 字段(不要同數(shù)組符號(hào) @ 相混淆)是普通的字段。

      • @,^ 后的 <, >,| 長(zhǎng)度決定了字段的長(zhǎng)度,如果變量超出定義的長(zhǎng)度,那么它將被截?cái)唷?/p>

      • <, >,| 還分別表示,左對(duì)齊,右對(duì)齊,居中對(duì)齊。

      • ^ 字段用于多行文本塊填充。

      格式值域含義
      @<<<左對(duì)齊輸出
      @>>>右對(duì)齊輸出
      @|||中對(duì)齊輸出
      @##.##固定精度數(shù)字
      @*多行文本

      在上表中,除了多行值域@*,域?qū)挾嫉扔谄渲付ǖ陌址鸃在內(nèi)的字符個(gè)數(shù)

      format EMPLOYEE =
      ===================================
      @<<<<<<<<<<<<<<<<<<<<<< @<< 
      $name, $age
      @#####.##
      $salary
      ===================================
      .
       
      select(STDOUT);
      $~ = EMPLOYEE;
       
      @n = ("Ali", "Runoob", "Jaffer");
      @a  = (20,30, 40);
      @s = (2000.00, 2500.00, 4000.000);
       
      $i = 0;
      foreach (@n){
          $name = $_;
          $age = $a[$i];
          $salary = $s[$i  ];
          write;
      }
      ===================================
      Ali                     20
        2000.00
      ===================================
      ===================================
      Runoob                  30
        2500.00
      ===================================
      ===================================
      Jaffer                  40
        4000.00
      ===================================

      格式變量

      • $~ ($FORMAT_NAME) :格式名字 \(^ (\)FORMAT_TOP_NAME) :當(dāng)前的表頭格式名字存儲(chǔ)在

      • $% ($FORMAT_PAGE_NUMBER) :當(dāng)前輸出的頁(yè)號(hào)

      • $= ($FORMAT_LINES_PER_PAGE) :每頁(yè)中的行數(shù)

      • $| ($FORMAT_AUTOFLUSH) :是否自動(dòng)刷新輸出緩沖區(qū)存儲(chǔ)

      • $^L ($FORMAT_FORMFEED) :在每一頁(yè)(除了第一頁(yè))表頭之前需要輸出的字符串存儲(chǔ)在

      $~ = "MYFORMAT"; # 指定默認(rèn)文件變量下所使用的格式
      write;           # 輸出 $~ 所指定的格式
       
      format MYFORMAT = # 定義格式 MYFORMAT 
      =================================
            Text # 菜鳥(niǎo)教程
      =================================
      .
      write;
      =================================
            Text # 菜鳥(niǎo)教程
      =================================
      =================================
            Text # 菜鳥(niǎo)教程
      =================================

      如果不指定$~的情況下,會(huì)輸出名為STDOUT的格式:

      write;         # 不指定$~的情況下會(huì)尋找名為STDOUT的格式
       
      format STDOUT =
      ~用~號(hào)指定的文字不會(huì)被輸出
      ----------------
        STDOUT格式
      ----------------
      .

      如果STDOUT也沒(méi)有,會(huì)報(bào)錯(cuò)。

      此外我們通過(guò)添加報(bào)表頭部信息來(lái)演示 $^ 或 $FORMAT_TOP_NAME 變量的使用

      format EMPLOYEE =
      ===================================
      @<<<<<<<<<<<<<<<<<<<<<< @<< 
      $name, $age
      @#####.##
      $salary
      ===================================
      .
       
      format EMPLOYEE_TOP =
      ===================================
      Name                    Age
      ===================================
      .
       
      select(STDOUT);
      $~ = EMPLOYEE;
      $^ = EMPLOYEE_TOP;
       
      @n = ("Ali", "Runoob", "Jaffer");
      @a  = (20,30, 40);
      @s = (2000.00, 2500.00, 4000.000);
       
      $i = 0;
      foreach (@n){
         $name = $_;
         $age = $a[$i];
         $salary = $s[$i  ];
         write;
      }
      ===================================
      Name                    Age
      ===================================
      ===================================
      Ali                     20
        2000.00
      ===================================
      ===================================
      Runoob                  30
        2500.00
      ===================================
      ===================================
      Jaffer                  40
        4000.00
      ===================================

      也可以使用 $% 或$FORMAT_PAGE_NUMBER 為報(bào)表設(shè)置分頁(yè):

      # 添加分頁(yè) $% 
      format EMPLOYEE_TOP =
      ===================================
      Name                    Age Page @<
                                       $%
      =================================== 
      .
      ===================================
      Name                    Age Page 1
      ===================================

      輸出到文件

      默認(rèn)情況下函數(shù)write將結(jié)果輸出到標(biāo)準(zhǔn)輸出文件STDOUT,我們也可以使它將結(jié)果輸出到任意其它的文件中。最簡(jiǎn)單的方法就是把文件變量作為參數(shù)傳遞給write,如:

      write(MYFILE);

      但是這樣就不能用$~變量來(lái)改變所使用的打印格式。系統(tǒng)變量$~只對(duì)默認(rèn)文件變量起作用,

      if (open(MYFILE, ">tmp")) {
      $~ = "MYFORMAT";
      write MYFILE; # 含文件變量的輸出,此時(shí)會(huì)打印與變量同名的格式,即MYFILE。$~里指定的值被忽略。
       
      format MYFILE = # 與文件變量同名 
      =================================
            輸入到文件中
      =================================
      .
      close MYFILE;
      }

      我們可以使用select改變默認(rèn)文件變量時(shí),它返回當(dāng)前默認(rèn)文件變量的內(nèi)部表示,這樣我們就可以創(chuàng)建子程序,按自己的想法輸出,又不影響程序的其它部分。

      if (open(MYFILE, ">>tmp")) {
      select (MYFILE); # 使得默認(rèn)文件變量的打印輸出到MYFILE中
      $~ = "OTHER";
      write;           # 默認(rèn)文件變量,打印到select指定的文件中,必使用$~指定的格式 OTHER
       
      format OTHER =
      =================================
        使用定義的格式輸入到文件中
      =================================
      . 
      close MYFILE;
      }

      11. 文件操作

      open(DATA, "<file.txt") or die "file.txt 文件無(wú)法打開(kāi), $!";
       
      while(<DATA>){
         print "$_";
      }

      <表示只讀方式。

      模式描述
      < 或 r只讀方式打開(kāi),將文件指針指向文件頭。
      > 或 w寫(xiě)入方式打開(kāi),將文件指針指向文件頭并將文件大小截為零。如果文件不存在則嘗試創(chuàng)建之。
      >> 或 a寫(xiě)入方式打開(kāi),將文件指針指向文件末尾。如果文件不存在則嘗試創(chuàng)建之。
      < 或 r讀寫(xiě)方式打開(kāi),將文件指針指向文件頭。
      > 或 w讀寫(xiě)方式打開(kāi),將文件指針指向文件頭并將文件大小截為零。如果文件不存在則嘗試創(chuàng)建之。
      >> 或 a讀寫(xiě)方式打開(kāi),將文件指針指向文件末尾。如果文件不存在則嘗試創(chuàng)建之。

      Sysopen函數(shù)

      sysopen 函數(shù)類似于 open 函數(shù),只是它們的參數(shù)形式不一樣。

      <FILEHANDL> 操作符

      我們使用 <FILEHANDLE> 操作符時(shí),它會(huì)返回文件句柄中每一行的列表,例如我們可以導(dǎo)入所有的行到數(shù)組中。

      讀取 import.txt 并將每一行放到 @lines 數(shù)組中:

      open(DATA,"<import.txt") or die "無(wú)法打開(kāi)數(shù)據(jù)";
      @lines = <DATA>; #<>操作符
      print @lines;    # 輸出數(shù)組內(nèi)容
      close(DATA);

      getc 函數(shù)

      getc 函數(shù)從指定的 FILEHANDLE 返回單一的字符,如果沒(méi)指定返回 STDIN。如果發(fā)生錯(cuò)誤,或在文件句柄在文件末尾,則返回 undef。

      read 函數(shù)

      read 函數(shù)用于從緩沖區(qū)的文件句柄讀取信息。這個(gè)函數(shù)用于從文件讀取二進(jìn)制數(shù)據(jù)。

      read FILEHANDLE, SCALAR, LENGTH, OFFSET
      read FILEHANDLE, SCALAR, LENGTH

      如果讀取成功返回讀取的字節(jié)數(shù),如果在文件結(jié)尾返回 0,如果發(fā)生錯(cuò)誤返回 undef。

      print 函數(shù)

      對(duì)于所有從文件句柄中讀取信息的函數(shù),在后端主要的寫(xiě)入函數(shù)為 print:

      print FILEHANDLE LIST
      print LIST
      print

      文件拷貝

       # 只讀方式打開(kāi)文件
      open(DATA1, "<file1.txt");
       
      # 打開(kāi)新文件并寫(xiě)入
      open(DATA2, ">file2.txt");
       
      # 拷貝數(shù)據(jù)
      while(<DATA1>)
      {
         print DATA2 $_;
      }
      close( DATA1 );
      close( DATA2 );

      文件重命名

      rename ("/usr/runoob/test/file1.txt", "/usr/runoob/test/file2.txt" ); #file1命名為file2

      刪除文件

      unlink ("/usr/runoob/test/file1.txt");

      指定文件讀寫(xiě)指針位置

      你可以使用 tell 函數(shù)來(lái)獲取文件的位置,并通過(guò)使用 seek 函數(shù)來(lái)指定文件內(nèi)的的位置:

      tell 函數(shù)用于獲取文件讀寫(xiě)指針位置:

      tell FILEHANDLE

      seek()函數(shù)是通過(guò)文件句柄來(lái)移動(dòng)文件讀寫(xiě)指針的方式來(lái)讀取或?qū)懭胛募?,以字?jié)為單位進(jìn)行讀取和寫(xiě)入:

      seek FILEHANDLE, POSITION, WHENCE

      • FILEHANDLE:文件句柄,用于存放一個(gè)文件唯一標(biāo)識(shí)符。

      • POSITION:表示文件句柄(讀寫(xiě)位置指針)要移動(dòng)的字節(jié)數(shù)。

      • WHENCE:表示文件句柄(讀寫(xiě)位置指針)開(kāi)始移動(dòng)時(shí)的起始位置,可以取的值為0、1、2;分別表示文件開(kāi)頭、當(dāng)前位置和文件尾。

      open(DATA,"<a.txt") or die "出錯(cuò)!";
      #seek DATA,5,0;
      $position = tell DATA;
      print "$position\n";
      
      while(<DATA>)
      {
          print "$_";
      }
      close (DATA);

      輸出:0
      dadad

      0表示指針位置。

      如果用seek進(jìn)行指針偏移:

      open(DATA,"<a.txt") or die "出錯(cuò)!";
      $ss = seek DATA,5,0;
      print "$ss\n";
      $position = tell DATA;
      print "$position\n";
      
      while(<DATA>)
      {
          print "$_";
      }
      close (DATA);

      輸出 1

      5

      返回1表示seek成功,后面沒(méi)輸出文件內(nèi)容因?yàn)槲募镂鍌€(gè)字符后沒(méi)內(nèi)容了。

      文件信息

      測(cè)試文件是否存在,是否可讀寫(xiě)等

      常用的是-e,文件或目錄是否存在;-d ,是否位目錄。

      my $file = "a.txt";
      my (@description, $size);
      if (-e $file)
      {
          push @description, '是一個(gè)二進(jìn)制文件' if (-B _);
          push @description, '是一個(gè)socket(套接字)' if (-S _);
          push @description, '是一個(gè)文本文件' if (-T _);
          push @description, '是一個(gè)特殊塊文件' if (-b _);
          push @description, '是一個(gè)特殊字符文件' if (-c _);
          push @description, '是一個(gè)目錄' if (-d _);
          push @description, '文件存在' if (-x _);
          push @description, (($size = -s _)) ? "$size 字節(jié)" : '空';
          print "$file 信息:", join(', ',@description),"\n";
      }

      輸出:a.txt 信息:是一個(gè)文本文件, 6 字節(jié)

      文件測(cè)試操作符如下表所示:

      操作符描述
      -A文件上一次被訪問(wèn)的時(shí)間(單位:天)
      -B是否為二進(jìn)制文件
      -C文件的(inode)索引節(jié)點(diǎn)修改時(shí)間(單位:天)
      -M文件上一次被修改的時(shí)間(單位:天)
      -O文件被真實(shí)的UID所有
      -R文件或目錄可以被真實(shí)的UID/GID讀取
      -S為socket(套接字)
      -T是否為文本文件
      -W文件或目錄可以被真實(shí)的UID/GID寫(xiě)入
      -X文件或目錄可以被真實(shí)的UID/GID執(zhí)行
      -b為block-special (特殊塊)文件(如掛載磁盤)
      -c為character-special (特殊字符)文件(如I/O 設(shè)備)
      -d為目錄
      -e文件或目錄名存在
      -f為普通文件
      -g文件或目錄具有setgid屬性
      -k文件或目錄設(shè)置了sticky位
      -l為符號(hào)鏈接
      -o文件被有效UID所有
      -p文件是命名管道(FIFO)
      -r文件可以被有效的UID/GID讀取
      -s文件或目錄存在且不為0(返回字節(jié)數(shù))
      -t文件句柄為TTY(系統(tǒng)函數(shù)isatty()的返回結(jié)果;不能對(duì)文件名使用這個(gè)測(cè)試)
      -u文件或目錄具有setuid屬性
      -w文件可以被有效的UID/GID寫(xiě)入
      -x文件可以被有效的UID/GID執(zhí)行
      -z文件存在,大小為0(目錄恒為false),即是否為空文件,

      12. 目錄操作

      opendir DIRHANDLE, EXPR  # 打開(kāi)目錄
      readdir DIRHANDLE        # 讀取目錄
      rewinddir DIRHANDLE      # 定位指針到開(kāi)頭
      telldir DIRHANDLE        # 返回目錄的當(dāng)前位置
      seekdir DIRHANDLE, POS   # 定位指定到目錄的 POS 位置
      closedir DIRHANDLE       # 關(guān)閉目錄

      顯示所有的文件

      使用glob函數(shù)

      # 顯示 /tmp 目錄下的所有文件
      $dir = "/tmp/*";
      my @files = glob( $dir );
       
      foreach (@files ){
         print $_ . "\n";
      }
       
      # 顯示 /tmp 目錄下所有以 .c 結(jié)尾的文件
      $dir = "/tmp/*.c";
      @files = glob( $dir );
       
      foreach (@files ){
         print $_ . "\n";
      }
       
      # 顯示所有隱藏文件
      $dir = "/tmp/.*";
      @files = glob( $dir );
      foreach (@files ){
         print $_ . "\n";
      }
       
      # 顯示 /tmp 和 /home 目錄下的所有文件
      $dir = "/tmp/* /home/*";
      @files = glob( $dir );
       
      foreach (@files ){
         print $_ . "\n";
      }

      或者:

      opendir (DIR, '.') or die "無(wú)法打開(kāi)目錄, $!";
      while ($file = readdir DIR) {
        print "$file\n";
      }
      closedir DIR;
      
      # 如果你要顯示 /tmp 目錄下所有以 .c 結(jié)尾的文件,可以使用以下代碼:
      opendir(DIR, '.') or die "無(wú)法打開(kāi)目錄, $!";
      foreach (sort grep(/^.*\.c$/,readdir(DIR))){
         print "$_\n";
      }
      closedir DIR;

      創(chuàng)建一個(gè)新目錄

      $dir = "/tmp/perl";
       
      # 在 /tmp 目錄下創(chuàng)建 perl 目錄
      mkdir( $dir ) or die "無(wú)法創(chuàng)建 $dir 目錄, $!";
      print "目錄創(chuàng)建成功\n";

      刪除目錄

      $dir = "/tmp/perl";
       
      # 刪除 /tmp 目錄下的 perl 目錄
      rmdir( $dir ) or die "無(wú)法刪除 $dir 目錄, $!";
      print "目錄刪除成功\n";

      切換目錄

      $dir = "/home";
       
      # 將當(dāng)期目錄移動(dòng)到 /home 目錄下
      chdir( $dir ) or die "無(wú)法切換目錄到 $dir , $!";
      print "你現(xiàn)在所在的目錄為 $dir\n";

      13. 錯(cuò)誤處理

      14. 特殊變量

      • Perl 語(yǔ)言中定義了一些特殊的變量,通常以 $, @, 或 % 作為前綴,例如:$_。

      • 很多特殊的變量有一個(gè)很長(zhǎng)的英文名,操作系統(tǒng)變量 $! 可以寫(xiě)為 $OS_ERROR。

      • 如果你想使用英文名的特殊變量需要在程序頭部添加 use English;。這樣就可以使用具有描述性的英文特殊變量。

      • 最常用的特殊變量為 $_,該變量包含了默認(rèn)輸入和模式匹配內(nèi)容。

      foreach ('Google','Runoob','Taobao') {
          print $_;
          print "\n";
      }
      foreach ('Google','Runoob','Taobao') {
          print;
          print "\n";
      }

      上面兩個(gè)的輸出結(jié)果都是一樣的。因?yàn)閜rint 沒(méi)有指定輸出變量時(shí)默認(rèn)用$_

      以下是幾處即使沒(méi)有寫(xiě)明 Perl 也會(huì)假定使用 $_ 的地方:

      • 各種單目函數(shù),包括像 ord() 和 int() 這樣的函數(shù)以及除 "-t"以外所有的文件 測(cè)試操作 ("-f","-d"),"-t" 默認(rèn)操作 STDIN。

      • 各種列表函數(shù),例如 print() 和 unlink()。

      • 沒(méi)有使用 "=~" 運(yùn)算符時(shí)的模式匹配操作 "m//"、"s///" 和"tr///"。

      • 在沒(méi)有給出其他變量時(shí)是 "foreach" 循環(huán)的默認(rèn)迭代變量。

      • grep() 和 map() 函數(shù)的隱含迭代變量。

      • 當(dāng) "while" 僅有唯一條件,且該條件是對(duì) ""操作的結(jié)果進(jìn)行測(cè)試時(shí),$_ 就是存放輸入記錄的默認(rèn)位置。除了"while" 測(cè)試條件之外不會(huì)發(fā)生這種情況。(助記:下劃線在特定操作中是可以省略的。)

      特殊變量列舉表

      https://www.runoob.com/perl/perl-special-variables.html

      15. 正則表達(dá)式

      Perl語(yǔ)言的正則表達(dá)式功能非常強(qiáng)大,基本上是常用語(yǔ)言中最強(qiáng)大的,很多語(yǔ)言設(shè)計(jì)正則式支持的時(shí)候都參考Perl的正則表達(dá)式。

      Perl的正則表達(dá)式的三種形式,分別是匹配,替換和轉(zhuǎn)化:

      • 匹配:m//(還可以簡(jiǎn)寫(xiě)為//,略去m)

      • 替換:s///

      • 轉(zhuǎn)化:tr///

      這三種形式一般都和 =~!~ 搭配使用, =~ 表示相匹配,!~ 表示不匹配。

      匹配操作符

      匹配操作符 m// 用于匹配一個(gè)字符串語(yǔ)句或者一個(gè)正則表達(dá)式,例如,要匹配 標(biāo)量 $bar 中的 "run",代碼如下所示:

      $bar = "I am runoob site. welcome to runoob site.";
      if ($bar =~ /run/){
         print "第一次匹配\n";
      }else{
         print "第一次不匹配\n";
      }
       
      $bar = "run";
      if ($bar =~ /run/){
         print "第二次匹配\n";
      }else{
         print "第二次不匹配\n";
      }
      第一次匹配
      第二次匹配
      模式匹配修飾符
      修飾符描述
      i忽略模式中的大小寫(xiě)
      m多行模式
      o僅賦值一次
      s單行模式,"."匹配"\n"(默認(rèn)不匹配)
      x忽略模式中的空白
      g全局匹配
      cg全局匹配失敗后,允許再次查找匹配串

      正則表達(dá)式變量

      perl處理完后會(huì)給匹配到的值存在三個(gè)特殊變量名:

      • $`: 匹配部分的前一部分字符串

      • $&: 匹配的字符串

      • $': 還沒(méi)有匹配的剩余字符串

      如果將這三個(gè)變量放在一起,你將得到原始字符串。

      $string = "welcome to runoob site.";
      $string =~ m/run/;
      print "匹配前的字符串: $`\n";
      print "匹配的字符串: $&\n";
      print "匹配后的字符串: $'\n";

      替換操作符

      替換操作符 s/// 是匹配操作符的擴(kuò)展,使用新的字符串替換指定的字符串?;靖袷饺缦拢?/p>

      s/PATTERN/REPLACEMENT/修飾符;
      $string = "welcome to google site.";
      $string =~ s/google/runoob/;
       
      print "$string\n";
      替換操作修飾符
      修飾符描述
      i如果在修飾符中加上"i",則正則將會(huì)取消大小寫(xiě)敏感性,即"a"和"A" 是一樣的。
      m默認(rèn)的正則開(kāi)始"^"和結(jié)束"$"只是對(duì)于正則字符串如果在修飾符中加上"m",那么開(kāi)始和結(jié)束將會(huì)指字符串的每一行:每一行的開(kāi)頭就是"^",結(jié)尾就是"$"。
      o表達(dá)式只執(zhí)行一次。
      s如果在修飾符中加入"s",那么默認(rèn)的"."代表除了換行符以外的任何字符將會(huì)變成任意字符,也就是包括換行符!
      x如果加上該修飾符,表達(dá)式中的空白字符將會(huì)被忽略,除非它已經(jīng)被轉(zhuǎn)義。
      g替換所有匹配的字符串。
      e替換字符串作為表達(dá)式

      轉(zhuǎn)化操作符

      修飾符描述
      c轉(zhuǎn)化所有未指定字符
      d刪除所有指定字符
      s把多個(gè)連續(xù)相同的輸出字符縮成一個(gè)

      以下實(shí)例將變量 $string 中的所有小寫(xiě)字母轉(zhuǎn)化為大寫(xiě)字母:

      $string = 'welcome to runoob site.';
      $string =~ tr/a-z/A-z/;
      
      print "$string\n";

      以下實(shí)例使用 /s 將變量 $string 重復(fù)的字符刪除:

      $string = 'runoob';
      $string =~ tr/a-z/a-z/s;
       
      print "$string\n";
      $string =~ tr/\d/ /c;     # 把所有非數(shù)字字符替換為空格
      $string =~ tr/\t //d;     # 刪除tab和空格
      $string =~ tr/0-9/ /cs    # 把數(shù)字間的其它字符替換為一個(gè)空格。

      更多正則表達(dá)式規(guī)則

      表達(dá)式描述
      .匹配除換行符以外的所有字符
      x?匹配 0 次或一次 x 字符串
      x*匹配 0 次或多次 x 字符串,但匹配可能的最少次數(shù)
      x匹配 1 次或多次 x 字符串,但匹配可能的最少次數(shù)
      .*匹配 0 次或多次的任何字符
      .匹配 1 次或多次的任何字符
      {m}匹配剛好是 m 個(gè) 的指定字符串
      {m,n}匹配在 m個(gè) 以上 n個(gè) 以下 的指定字符串
      {m,}匹配 m個(gè) 以上 的指定字符串
      []匹配符合 [] 內(nèi)的字符
      [^]匹配不符合 [] 內(nèi)的字符
      [0-9]匹配所有數(shù)字字符
      [a-z]匹配所有小寫(xiě)字母字符
      [^0-9]匹配所有非數(shù)字字符
      [^a-z]匹配所有非小寫(xiě)字母字符
      ^匹配字符開(kāi)頭的字符
      $匹配字符結(jié)尾的字符
      \d匹配一個(gè)數(shù)字的字符,和 [0-9] 語(yǔ)法一樣
      \d匹配多個(gè)數(shù)字字符串,和 [0-9] 語(yǔ)法一樣
      \D非數(shù)字,其他同 \d
      \D非數(shù)字,其他同 \d
      \w英文字母或數(shù)字的字符串,和 [a-zA-Z0-9_] 語(yǔ)法一樣
      \w和 [a-zA-Z0-9_] 語(yǔ)法一樣
      \W非英文字母或數(shù)字的字符串,和 [^a-zA-Z0-9_] 語(yǔ)法一樣
      \W和 [^a-zA-Z0-9_] 語(yǔ)法一樣
      \s空格,和 [\n\t\r\f] 語(yǔ)法一樣
      \s和 [\n\t\r\f] 一樣
      \S非空格,和 [^\n\t\r\f] 語(yǔ)法一樣
      \S和 [^\n\t\r\f] 語(yǔ)法一樣
      \b匹配以英文字母,數(shù)字為邊界的字符串
      \B匹配不以英文字母,數(shù)值為邊界的字符串
      a|b|c匹配符合a字符 或是b字符 或是c字符 的字符串
      abc匹配含有 abc 的字符串 (pattern) () 這個(gè)符號(hào)會(huì)記住所找尋到的字符串,是一個(gè)很實(shí)用的語(yǔ)法.第一個(gè) () 內(nèi)所找到的字符串變成 $1 這個(gè)變量或是 \1 變量,第二個(gè) () 內(nèi)所找到的字符串變成 $2 這個(gè)變量或是 \2 變量,以此類推下去.
      /pattern/ii 這個(gè)參數(shù)表示忽略英文大小寫(xiě),也就是在匹配字符串的時(shí)候,不考慮英文的大小寫(xiě)問(wèn)題.  如果要在 pattern 模式中找尋一個(gè)特殊字符,如 "*",則要在這個(gè)字符前加上  符號(hào),這樣才會(huì)讓特殊字符失效
      來(lái)源:https://www./content-1-643601.html

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多