【perl編程綜合】小駱駝學(xué)習(xí)筆記

歡迎關(guān)注公眾號(hào):oddxix
最近算是系統(tǒng)的學(xué)完了perl了合搅,一下是對(duì)小駱駝的整理贬媒,感謝博主鐵漢柔情1990的perl筆記粉私。

接下來幾天系統(tǒng)學(xué)完Linux就可以入手Python了惫谤,有點(diǎn)小緊臟嘻嘻

1.perl入門

perl全名是practical extraction and report language,實(shí)用摘錄于報(bào)表語(yǔ)言壁顶。主要用于文字處理,具有容易使用溜歪,不受限制若专,速度快,代碼有點(diǎn)難看等特點(diǎn)蝴猪。我覺得最牛逼的地方在于他是不封閉的调衰,你可以看到他的代碼。

腳本的編寫:

例1:

#自阱! /usr/bin/perl
print "hello,world!\n";
#嚎莉! /usr/bin/perl
use 5.010
say "hello,world!";

第一行#! /usr/bin/perl的意思是使用/usr/bin目錄下的Perl來解讀下面的程序,其中#沛豌!是一個(gè)特殊注釋符趋箩,一般的#是普通的注釋符,從開始到行結(jié)尾的部分加派,普通的注釋符是沒有啥意義的叫确,就是在程序里面一個(gè)簡(jiǎn)單說明說明,方便其他人來讀你的程序的時(shí)候更容易理解芍锦。 一般perl都是在/usr/bin這個(gè)目錄下启妹,如果不在記得修改其地址,當(dāng)然還可以通過#! /usr/bin/envperl來幫你定位perl

這是兩個(gè)代碼醉旦,但輸出的結(jié)果一樣饶米。\n是換行符的意思,打出這個(gè)結(jié)果后车胡,光標(biāo)落在下一行檬输,而用say就可以不用輸入\n而自動(dòng)換行,但是有一個(gè)條件匈棘,必須是perl 5.10版本以后丧慈,如果不是就,就得提醒一下主卫,通過use 5.010告訴解釋器逃默,但是解釋器識(shí)別的是小數(shù)點(diǎn)后三位,所以perl 5.10版本得寫成5.010
這里可以通過perl -v來看你版本簇搅,我的是5.14.2

腳本的命名:

Perl程序并不需要什么特殊的文件名或拓展名完域,甚至不用拓展名就最好不要用。就是怕用其他的程序改寫后以免引起誤解瘩将。但是呢吟税,我一般還是會(huì)用.pl凹耙,至少提醒自己這個(gè)文件是一個(gè)腳本啊,你覺得呢

腳本的運(yùn)行:

你可以直接在終端中 :perl my_pro.pl #my_pro是你編寫的腳本的名字
也可以chmod a+x my_pro 把該文件變成一個(gè)可執(zhí)行的程序肠仪,然后cd到該文件夾肖抱,同多./my_pro來運(yùn)行,淡然如果是可執(zhí)行的文件异旧,在修改的時(shí)候得注意了意述,我之前提到過,打開后i修改吮蛹,esc后欲险, :wq來保存

CPAN

comprehensive perl archive network,里面有很多perl的源代碼匹涮,各種下載

2.Perl--標(biāo)量變量

Perl標(biāo)量(scalar)是稱呼單個(gè)的事物,可以是數(shù)字槐壳,也可以是字符串然低。變量即為存儲(chǔ)一個(gè)或多個(gè)值的容器的名稱。標(biāo)量變量為僅僅存放一個(gè)值的變量务唐。

首先雳攘,我們來聊一下perl常見的單引號(hào)雙引號(hào)的區(qū)別:
1,兩者都是用來讓perl識(shí)別字符串的開始和結(jié)尾 “fred”和‘fred’效果一樣
2枫笛,單引號(hào)  也只有在反斜線后面接單引號(hào)或反斜線時(shí)吨灭,才表示轉(zhuǎn)義。要使用\則需要在前面加一個(gè)\來轉(zhuǎn)義刑巧,要使用'則需要在前面加一個(gè)\來轉(zhuǎn)義喧兄,例如:‘\'\\' 表示單引號(hào)后接一個(gè)反斜線
3,雙引號(hào)  一般用作轉(zhuǎn)義或這是使用變量?jī)?nèi)插
     \在里面有很強(qiáng)的轉(zhuǎn)義功能啊楚,比如\n表示換行吠冤,一般結(jié)尾都需要來個(gè)這個(gè)
     \f換頁(yè)     ……
     $meal="bro steak";
     $barney="fred ate a $meal";
     $barney='fred ate a'.$meal;  這兩種寫法效果一樣,其中.表示為鏈接字符串的操作符恭理。所以上面那個(gè)看上去更簡(jiǎn)潔嘛

結(jié)合著例子來說明吧

第一個(gè)例子:提示用戶輸入半徑來求周長(zhǎng)

#拯辙! /usr/bin/perl                     #告訴腳本Perl在哪里運(yùn)行
use warnings;                         #有錯(cuò)誤的話,就提醒颜价,也可以跟上面合并#涯保! /usr/bin/perl  -w
$pi=3.141592654;                      #定義標(biāo)量變量$pi的值為
print "What is the radius?";          #提示輸入半徑
chomp($radius=);               #為行輸入,其返回的字符串一般在末尾都會(huì)有換行符周伦,如果字符串后面有兩個(gè)以上的換行符夕春,chomp()僅僅刪除一個(gè)
print "The circumeference of acircle of radius $radius is $circ.\n";  #后面不輸入\n的話結(jié)果末尾光標(biāo)提示有誤

第二個(gè)例子:當(dāng)輸入的半徑小于0時(shí),輸出的結(jié)果為0专挪,不為負(fù)數(shù)撇他。

#茄猫! /usr/bin/perl
use warnings;
$pi=3.141592654;
print "What is the radius?";
chomp($radius=);
$circ=$pi*2*$radius;
if($radius<0){
   print "0\n"
   }else{
    print "The circumeference of acircle of radius $radius is $circ.\n";
    }

這里面就是多了一個(gè)if語(yǔ)句,如果()里面的困肩,就怎樣划纽,否則……

第三個(gè)例子:提示用戶輸入兩個(gè)數(shù)字,然后輸出兩者的乘積

#锌畸! /usr/bin/perl
use warnings;
print "What is the one?";
chomp($one=);
print "What is the two?";
chomp($two=);
$three=$one*$two;
print "The result is $three\n";

第四個(gè)例子:提示輸出一個(gè)字符串和一個(gè)數(shù)字勇劣,使用x操作符

#! /usr/bin/perl
use warnings;
print "plese enter a string:";
chomp($one=);
print "please enter a number of times:";
chomp($two=);
$three=$one x $two;
print "The result is $three\n";

each操作符:

  my @rocks=qw / bedrock slate rubble granite/;
  while(my($index,$value)=each @rocks){
      say"$index:$value";
      }

每次對(duì)數(shù)組調(diào)用each潭枣,會(huì)返數(shù)組中下一個(gè)元素所對(duì)應(yīng)的兩個(gè)值--該元素的索引以及各該元素的值

3.perl--列表和數(shù)組

列表是標(biāo)量的有序集合比默,數(shù)組是存儲(chǔ)列表的變量。數(shù)組或列表中的每個(gè)原書都是單獨(dú)的標(biāo)量變量盆犁,擁有獨(dú)立的標(biāo)量值命咐,這些值是有序的,也就說谐岁,從開始到終止元素的先后次序是固定的醋奠。并且每個(gè)元素都有相應(yīng)的整數(shù)作為索引,此數(shù)字從0開始遞增伊佃,每次加1.
還是來案例來理解這一節(jié)的東西吧窜司。

1,寫入一個(gè)程序航揉,讀入一些字符串(每行一個(gè)塞祈,)直到文件結(jié)尾位置,然后帅涂,再以相反的順序輸出這個(gè)列表议薪。

#! /usr/bin/perl
use warnings;
print "please enter your string,then press Ctrl+D:\n";
@lines=;
@a=reverse @lines;
print @a;
#在列表上下文中,會(huì)返回所有剩下的行媳友,知道文件結(jié)尾為止笙蒙,
#通常可以鍵入Control+D來告知系統(tǒng)庆锦,不會(huì)有任何輸入了(對(duì)于DOS/Windows來說捅位,要用Control+Z)
reverse操作符會(huì)讀取列表或數(shù)組的值,并按相反的次序返回該列表搂抒,這個(gè)是對(duì)..很好的補(bǔ)充艇搀,因?yàn)?..10代表6到10,但其中..只表示遞增的關(guān)系求晶。

2寫一個(gè)程序焰雕,讀入一數(shù)字(每行一個(gè)),直到文件結(jié)尾為止芳杏,然后根據(jù)每一個(gè)俗子輸入的如下名單中相應(yīng)的人名矩屁。

#! /usr/bin/perl
use warnings;
print "please enter some numbers from 1 to 7,one per line,then press Ctrl-D:\n";
chomp(@a=);
@b=qw(fred betty barney dino wilma pebbles bamm-bann);
foreach $_ (@a){
   print "$b[$_-1]\n";
    };
    #chomp會(huì)自動(dòng)去掉每個(gè)元素的換行符
 qw表示quoted word辟宗,perl會(huì)把其當(dāng)作單引號(hào)的內(nèi)的字符串來處理,所以qw構(gòu)建的列表中吝秕,不能像雙引號(hào)內(nèi)的字符一樣用\n或$fred.其中的空白符(如空格泊脐,制表符,換行符)烁峭,同時(shí)還容許其他任何標(biāo)點(diǎn)符號(hào)作為定界符容客,只要左右的相同,同時(shí)如果你要在被圈引的字符串內(nèi)使用定界符约郁,還可以通過反斜線轉(zhuǎn)義來引入這個(gè)字符缩挑。
 foreach $_ ()就是一個(gè)個(gè)的找()內(nèi)的單個(gè)字符串,然后單個(gè)的字符串定義為$_,其中$_是默認(rèn)的鬓梅,可以不寫供置,后面默認(rèn),同時(shí)也可以寫使用其他的標(biāo)量變量绽快。
 $b[$_-1]表示取數(shù)組@b中的第$_個(gè)元素芥丧。無(wú)論是列表還是數(shù)組,其索引都是從0開始的谎僻,所以數(shù)組中對(duì)應(yīng)的第一個(gè)對(duì)象的索引號(hào)為0,對(duì)于@a其最大的索引為$#a,注意這個(gè)數(shù)會(huì)比數(shù)組元素的個(gè)數(shù)少1.還有一個(gè)“負(fù)數(shù)數(shù)組索引值”寓辱,最后一個(gè)元素的索引值為-1艘绍,倒數(shù)第二個(gè)為-2,一次類推秫筏。
@b數(shù)組名只能包含標(biāo)量诱鞠,不能包含其他數(shù)組,所以數(shù)組無(wú)法成為列表里的元素这敬,只能展開生成元素列表航夺。

3,讀入一些字符串(每行一個(gè))崔涂,知道文件結(jié)尾為止阳掐,然后按ASCII碼順序來輸出所有的字符串。
輸出的結(jié)果在一行

#! /usr/bin/perl
use warnings;
print "please enter some some strings,one per line,then press Ctrl-D:\n";
chomp(@a=);
@b=sort @a;
print "@b\n";
輸出的結(jié)果在不同的行
#! /usr/bin/perl
use warnings;
print "please enter some some strings,one per line,then press Ctrl-D:\n";
chomp(@a=);
@b=sort @a;
foreach $b(@b) {
      print "$b\n";
            }

其中sort就是一個(gè)排序操作符冷蚂,規(guī)則是大寫字符在小寫字符前面缭保,數(shù)字排在字母前面,標(biāo)點(diǎn)符號(hào)散落各地蝙茶,但100艺骂,99的排序的時(shí)候還是100,99隆夯,因?yàn)楦鶕?jù)默認(rèn)的排序規(guī)則钳恕,任何以1開頭的字符串會(huì)被排在以9開頭的字符串之前别伏。

4.perl--數(shù)組中元素的修改

對(duì)尾部:

    pop操作符負(fù)責(zé)取出數(shù)組中最后一個(gè)元素并將其作為返回值返回。
    @a=5..9
    @b=pop@a
    其@b為9忧额,@為5..8
    或者直接pop@a,也就是刪掉@a的最后一個(gè)元素

    push操作符厘肮,用來加入一個(gè)元素(或是一串元素)到數(shù)組的尾端。
    push @a,5;   #數(shù)組a中最后一個(gè)元素加入5
    @b=qw/ 9 0 9 0 3/;
    push @a,@b;   @a得到了5個(gè)新元素

對(duì)頭部:

    $a=shift (@b);   #@b前一個(gè)元素丟失宙址,$a為其第一個(gè)元素
    unshift同理push
    unshift @arrary,@others

對(duì)整體:

     替換和刪除   
     @a=splice @b,2,4,qw(c b d)
    其中@b為處理的數(shù)組轴脐,2代表的是要操作的一組元素開始位置,其指示索引值抡砂,相當(dāng)于把光標(biāo)放在了第二個(gè)元素的后面大咱,如果僅僅就給出前面兩個(gè)參數(shù),perl會(huì)從給定位置開始一直到末尾的全部元素提取出來并返回注益。其中4為指定操作的長(zhǎng)度碴巾。qw(c b d)為要替換的列表,替換的長(zhǎng)度不一定要跟拿走的長(zhǎng)度相等丑搔。
   @ab=qw(a b c d e);
   @removed=splice @ab,1,2,qw(will); 
   #刪除b,c ;@removed變成(b c);@ab變成qw(a will d e)

   增加:
   @array=qw( pebbles dino fred barney betty);
   @removed=splice @array,1,0,qw(wilma);
   #什么元素都不刪厦瓢,@removed變成了qw();@array變成了qw(pebbles wilma dino ...)

5.Perl--子程序

Perl可以讓你創(chuàng)建子程序,它讓我們可以重復(fù)利用已有的代碼

例1:寫一個(gè)求和的子程序啤月,同時(shí)檢驗(yàn)

#! /usr/bin/perl
use strict;                          #告訴perl內(nèi)部的編譯器的代碼應(yīng)該稍微嚴(yán)謹(jǐn)一些煮仇。也可以通過use                                           5.012隱式打開,
use warnings;
sub total{                            #要定義自己的子程序谎仲,可以通過sub,子程序名浙垫,花括號(hào)封閉起來
   my $sum=0;
   foreach (@_){
   $sum +=$_;
   }  
    $sum;
  }
my @fred =qw(1 2 5 7 9);   
my $fred_total=&total(@fred);          #通過&來調(diào)用子程序,如果不引起歧義郑诺,可以省略&夹姥。()里面是
print "The total of \@fred is $fred_total.\n";    參數(shù) 
print "Enter some numbers on seperate lines:";
my $user_total=total();
print "The total of those numbers is $user_total.\n";

所有的子程序都有一個(gè)返回值--子程序并沒有“有返回值”或“沒有返回值”之分。但并不是所有的在子程序的返回值都是有用的辙诞。最后一次結(jié)果都將自動(dòng)當(dāng)初子程序的返回值辙售。在子程序里添加額外的程序代碼時(shí),請(qǐng)小心檢查最后執(zhí)行的表達(dá)式是哪一個(gè)飞涂,確定它是你要的返回值旦部。
子程序自動(dòng)將參數(shù)存在了@中,其中第一個(gè)參數(shù)為$[0],第二個(gè)為$[1],一次類推较店,這些變量和$沒有任何關(guān)系志鹃。其中@_為子程序的私有變量。
perl里面所有的變量都都是全局變量泽西,在程序的任何地方都可以訪問他們曹铃。可以借助my來創(chuàng)建私有變量捧杉。這些變量屬于子程序封閉語(yǔ)句塊所有陕见,其他地方使用不受影響秘血。my fred,barney,只能申明第一個(gè)為私有變量。

return,子程序執(zhí)行到一半的時(shí)候停止執(zhí)行:

sub which_element_Is{
         my($what,@array)
             foreach (0..$#array)
           if ($what eq $array[$_]){
                    return $_;
              }
             }
             -1;
           }

例2:找出大于平均值的數(shù)

#! /usr/bin/perl
use warnings;
use strict;
sub average{
   my $sum=0;
   my $n=0;
   my $average;
   foreach (@_){
   $sum +=$_;
   $n +=1;                  #也可以通過$n=@_來知道含有多少個(gè)元素评甜。
   }  
   $average=$sum/$n;
   }
sub above_average{
     my @lists;              #定義私有變量
     my $a=&average(@_);     #調(diào)用上面的子程序
     foreach (@_) {    
     if ($_>$a){
      push @lists,$_;       #push往首先加元素
       } 
        }
      @lists;   
     }
my @fred=&above_average(1..10);
print "\@fred is @fred\n";

例3:記錄之前都來了那些人

#! /usr/bin/perl
use warnings;
use strict;
use 5.010;
sub greet{
   state @names;
   my $name=shift;
   print"hi $name!";
   if (@names){
   print "I've seen:@names\n";
   }
   else{
   print "You are the first one here!\n";
   }
   push @names,$name;
   }
greet('fred');
greet('barney');
greet('wilma');

6.Perl--輸入和輸出

前面已經(jīng)提到$line=,@line=灰粮,即可以過多鍵盤輸入的東西進(jìn)入到程序中去運(yùn)行。<>是另一種讀取的方式忍坷,鉆石操作符是行輸入操作符的特例粘舟,它不是從鍵盤輸入,而是從用戶指定的位置讀取佩研。

   while(defined($line=<>)){
    chomp($line);
    print "It was $line that I saw!\n";
   }

也可以簡(jiǎn)寫為

 while(<>){
    chomp;
    print"It was $_ that I saw!\n";

鉆石操作符是用來讀取輸入的柑肴,而輸入的內(nèi)容可以在$_中找到。
鉆石操作符會(huì)先查看數(shù)組@ARGV旬薯,然后決定該用那些文件名晰骑,如果它找到的是空列表,就會(huì)改用標(biāo)準(zhǔn)輸入流绊序,例如在前面的程序中加入@ARGV=“”硕舆,它就只會(huì)去讀這里面的文件了。

print @arrary;
print "@arrary";

第一個(gè)print語(yǔ)句會(huì)一個(gè)接一個(gè)地打印出數(shù)組中的所有的元素骤公,元素之間不會(huì)有空格抚官,比如@arrary=qw"fred barney betty",第一個(gè)語(yǔ)句輸出的是fredbarneybetty,而第二個(gè)輸出的是空格隔開的fred barney betty.
如果有換行符,建議還是用第一種阶捆,如果不含換行符凌节,用第二種,當(dāng)然后面可以加\n

printf操作符的參數(shù)包含“格式字符串”以及“要輸出的數(shù)據(jù)列表”
例如:printf "Hello,$s;your password expires in %d days!\n",$user,$days_to_die;
出來的結(jié)果是:Hello,merlyn;your password expires in 3 days!
最常用的格式
恰當(dāng)?shù)臄?shù)字格式:

 printf "g% %g %g\n",5/2,51/17,51**17 # %g會(huì)按需要自動(dòng)選擇浮點(diǎn)數(shù)趁猴,整數(shù)甚至指數(shù)形式
    print "in %d days !\n",17.58          #%d代表十進(jìn)制的整數(shù)刊咳,無(wú)條件的曲調(diào)小數(shù)點(diǎn)后面的數(shù)字
** 字符的格式**:
    printf "m\n",42          #輸出的結(jié)果看起來像····41(其中·代表空格)
    printf "s\n","wilma";   #看起來像·····wilma
    printf "%-10s\n","wilma";  #負(fù)號(hào)是左對(duì)齊彪见,結(jié)果為wilma·····
    printf ".3f\n",6*7+2/3  #%f按需要四舍五入儡司,可以指定字段寬度和小數(shù)點(diǎn)位數(shù)結(jié)果為                                                ······42.667 
要輸出真正的%,請(qǐng)用%%
   print"%.2f%%\n"余指,5.25/12;      # 結(jié)果為0.44%
**數(shù)組的格式**: 
      $format="The items are :\n".("%${width}s\n"x@string);  #${width}為變量指定的字符寬度捕犬,為了         printf $format,@string;格式:                               避免混淆,加了{(lán)}

文件句柄

代表perl進(jìn)程與外鍵之間I/O聯(lián)系的名稱酵镜,僅僅是聯(lián)系的房產(chǎn)碉碉,不是文件的名稱。建議用全大寫字母來命名文件句柄淮韭。跟已有的文件柄:STDIN,DTDOUT,STEERR,DATA,ARGV,ARGVOUT不要重名垢粮,其他的可以選擇自己喜歡的名字。

方式1: perl tac2 <> uuu
方式2 ./tac2 <> uuu
其中tac2為寫的腳本靠粪, <>中的m為輸入的文件 ,uuu為你存放生成的結(jié)果的文件名蜡吧,可以自己取名字毫蚓。

打開文件句柄
open CONFIG,'dino';
open CONFIG,'
open BEDROCK,'.fred';
open LOG,'>>logfile';
第一行打開名為CONFIG的文件句柄,讓它指向文件dino,也就是打開文件dino,文件中的任何內(nèi)容都可以從文件句柄CONFIG被督導(dǎo)我們的程序中來昔善。
第二行申明此文件用來讀取的元潘,而非寫入的
第三行用來創(chuàng)建一個(gè)新的文件,打開文件句柄BEDROCK君仆,并輸入到新的文件fred中翩概,如果已有該文件,就清除重新建
第四行用來追加的方式打開文件返咱,

open的三個(gè)參數(shù)形式
open CONFIG,'<','dino';
open BEDROCK,'>',$file_name;
open LOG,'>>',&logfile_name();
這種寫法的好處就在于钥庇,可以在文件操作模式后面加上冒號(hào),寫上編碼名稱
open CONFIG,'<:encoding(UTF-8)','dino';

關(guān)閉文件句柄
close BEDROCK;
通知系統(tǒng)將尚未寫入的輸出數(shù)據(jù)寫到磁盤洛姑,顯得工整一些
改變默認(rèn)的文件輸出句柄:
select LOG; #選擇LOG作為輸出的文件句柄
$| =1; #輸出操作之后立刻刷新緩沖區(qū)
select STDOUT; #回復(fù)到默認(rèn)的輸出文件句柄STDOUT;
print LOG "This is very good!\n";

例1:反向輸出

#! /usr/bin/perl
use warnings;
use strict;
use 5.010;
my @line=<>;
chomp @line;
my @b=reverse(@line);
print "@b\n";
當(dāng)我在終端運(yùn)行這個(gè):perl tac m n (m,n為保存有字符串的文件)
     為什么沒有反向輸出的效果呢上沐?求解
     當(dāng)把里面的@改成$后,可以對(duì)單個(gè)文件處理楞艾,反向輸出参咙,這是個(gè)什么原因呢?

例2:用戶自定義輸出的字符寬度:

#! /usr/bin/perl
use warnings;
use strict;
my $width;
print"Please enter the number of size,the enter Ctrol +D to end:\n";
$width=<>;
chomp $width;
print"please enter the string,the enter Ctrol +D to end:\n";
my @string=<>;
chomp @string;
my $format="%${width}s\n"x@string;
printf $format,@string;

7.perl--哈希

哈希是一種數(shù)據(jù)結(jié)構(gòu)硫眯,它和數(shù)組的相似之處 在于可以容納任意多的值并能按需取用蕴侧,而它和數(shù)組的不同在于索引方式,數(shù)組以數(shù)字來索引两入,哈希則是以名字來索引净宵。哈希的索引值為鍵(key),并不是數(shù)字,而是任意唯一的字符串裹纳。這些鍵和值都是任意的標(biāo)量择葡,但鍵總會(huì)被轉(zhuǎn)換為字符串。即使哈希包含300萬(wàn)個(gè)鍵值對(duì)剃氧,從中提取任意的一項(xiàng)數(shù)據(jù)還是會(huì)和原來一樣快敏储。但鍵則必須是唯一的字符串。
它有什么用呢朋鞍?
按名字找姓
按主機(jī)名找IP
按IP找主機(jī)名
按單詞統(tǒng)計(jì)其出現(xiàn)次數(shù)(用的比較多)
按用戶名統(tǒng)計(jì)每個(gè)人使用
說白了已添,哈希就是個(gè)極其簡(jiǎn)單的數(shù)據(jù)庫(kù)。

訪問哈希元素: $family_name{'fred'}='flintstone';
這和數(shù)組的做法類似滥酥,只是使用了花括號(hào)而非方括號(hào)來表示索引值
哈希變量的命名不可以用數(shù)字開頭更舞。
訪問整個(gè)哈希 :
%some_hast=('foo',35,'bar',12.4,2.4,'helllo','wilma',1.72,'betty',"bye\n");
對(duì)哈希的賦值,等同于在列表上下文中賦值坎吻,列表中的元素應(yīng)該為鍵值對(duì)缆蝉。
也可以通過 my$inverse_hash=reverse %any_hash 把鍵值對(duì)給范徐過來,最好確認(rèn)值也是唯一的在使用,不然會(huì)弄錯(cuò)刊头。

my %last_name=(
     'fred' => 'flintstone',
     'dino' => undef,
      barney=>'rubble',
      betty =>'rubble',
         );

任何需要逗號(hào)的地方都可以用胖箭頭來替代贝搁,這對(duì)perl來說,并沒有多大的區(qū)別芽偏。使用胖箭頭的時(shí)候可以省略左邊的引號(hào)雷逆,會(huì)自動(dòng)被引起。同時(shí)污尉,在使用哈希額鍵膀哲,如果花括號(hào)內(nèi)只有裸字,兩邊的引號(hào)也可以省略被碗。(無(wú)需引號(hào)的字符序列某宪,我們稱之為裸字bareword,因?yàn)樗枪铝⒋嬖诘模?br> 當(dāng)然注意,$hash{bar.foo}=1; #構(gòu)成的鍵名是'barfoo'

my @k =keys \$hash;
my @v=values \$hash;

因?yàn)楣>拖褚粋€(gè)大酒桶兴喂,所以里面的順序是無(wú)法預(yù)測(cè)的,但是返回的鍵列表和值列表的順序還是一致的焚志。
my $count =keys %hash; #得到鍵值對(duì)數(shù)

while((\$key,$value)=each %hash){
  print "\$key =>$value\n";
    }
delete \$books{\$person};  #撤銷person的

%ENV 環(huán)境變量
修改環(huán)境變量

Bourne shell
   $CHARACTER=Fred; export CHARACTER
   $export CHARACTER=Fred

csh
   $ setenv CHARACTER FRED

DOS或者Windows命令
  c:>set CHARACTER=Fred

例1:根據(jù)姓來找名字(很有意思的)衣迷,程序名family_name

#! /usr/bin/perl
use warnings;
use strict;
my $s;
my %mily_name=("fred"=>'flintstone',
               "barney"=>'rubble',
                "wilma"=>'flintstone',
                 );
print "please enter the family name:\n";
$s=<>;
chomp $s;
print "The ${s}'s name is $family_name{$s}.\n"

例2:程序名為frequence,統(tǒng)計(jì)每行一個(gè)詞匯,這個(gè)詞匯出現(xiàn)的次數(shù)酱酬。

#! /usr/bin/perl
use strict;
use warnings;
my ($string,@string,%string);
@string=<>;
chomp @string;
foreach $string (@string){
     $string{$string}+=1; 
      }
foreach $string (sort keys %string){
     print"$string has show up $string{$string} times.\n";
    }

例3:程序名為ENV壶谒,讀取%ENV中的鍵值對(duì),排序膳沽,分兩列打印汗菜,縱向?qū)ζ洹?/p>

#! /usr/bin/perl
use warnings;
use strict;
my $longest;
my $key;
my $length;
foreach $key (sort keys %ENV){
    my $length=length($key);
    if ($length>=$longest){
      $longest=$length;
      }
     }
foreach $key (sort keys %ENV){
   printf "%-${longest}s %s\n","$key","$ENV{$key}";
      }

注:my操作符只能申明獨(dú)立的標(biāo)量,不能用來申明數(shù)組或哈希里的元素挑社。
use strict起作用時(shí)候才需要申明變量陨界,默認(rèn)情況下并不需要申明標(biāo)量。

8.perl--漫游正則表達(dá)式

正則表達(dá)式(regular expre ssion)是perl內(nèi)嵌痛阻,自成一體的微型編程語(yǔ)言菌瘪。出現(xiàn)在很多語(yǔ)言中,以及在大多數(shù)的程序員文本編輯器中(比如vi和emacs).在perl里通常叫做模式(pattern),用來表示匹配或不匹配某個(gè)字符段的特征模板录平。只要用一個(gè)模式就可以將它們干凈利落地分成兩組:匹配或者不匹配麻车。
在Unix的grep命令中缀皱,它會(huì)檢查哪幾行文本匹配到指定的模式斗这,然后輸出那幾行。
例如: $grep 'flint.stone' chapter.txt

如果模式匹配的對(duì)象是$_的內(nèi)容啤斗,只要模式寫在一對(duì)斜線(/)中就可以了,自動(dòng)去尋找
例如:

 \$_="yabba dabba doo"'
         if (/abba/){
          print;
           }

Unicode屬性
他們不只是簡(jiǎn)單的字節(jié)序列。每個(gè)字符出來字節(jié)組合之外牙寞,還有屬性信息。若要匹配某項(xiàng)屬性彼水,只需要把屬性名放入\p{PROPERTY}\里面。比如許多字符屬于空白符极舔,相應(yīng)的屬性名為space,所以要匹配帶有這類屬性的字符凤覆,可以用\p{Space}.將小寫的p改為大寫的P,就表示否定的意義,匹配指定屬性之外的字符拆魏。

. 能匹配任意一個(gè)字符的通配符(不能匹配換行符\n)盯桦,如果要表示點(diǎn)號(hào)本身的話,就需要在前面加上反斜線轉(zhuǎn)義渤刃。同時(shí)拥峦,如要匹配真正的\,也需要在前面加上\卖子。

* 用來匹配前面的條目零次或多次的略号。
+ 匹配前一個(gè)條目一次以上。
洋闽? 表示前一個(gè)條目是可有可無(wú)的
() 對(duì)字符串來分組

我們可以用反向引用來引用圓括號(hào)中的模式所匹配的文字玄柠,這個(gè)行為我們成為捕獲組。
(.)\1 表示匹配連續(xù)出現(xiàn)的兩個(gè)同樣的字符诫舅。\后面的數(shù)字是編號(hào)随闪,只要一次點(diǎn)算左括號(hào)的序號(hào)就可以了

$_="yabba dabba doo";
 if (/y((.)(.)\3\2)d\1/){
    print;
   }

有的時(shí)候?yàn)榱讼聪蛞媚J降闹苯恿坎糠值亩x性

use 5.010;     #這個(gè)版本開始才有這個(gè)功能
 $_="aa11bb";
 if (/(.)\g{1}11/){
   print;
   }

這里面的g{1}就相當(dāng)于\1,主要是為了避免歧義嘛骚勘,同時(shí)铐伴,也可以用負(fù)數(shù),相反的意思俏讹。

| 通常讀成“或”当宴,要么匹配左邊的內(nèi)容,要么匹配右邊的內(nèi)容泽疆。
[] 表示里面的字符集中任何一個(gè)户矢,比如[a-z],其中-是連字符,表示從a到z
^ 表示除什么之外殉疼,[^a-z]除a到z之外的任意的字符都能匹配

字符的簡(jiǎn)寫

表示任意一個(gè)數(shù)字的字符集的簡(jiǎn)寫是\d
\s 匹配任意空白符
\w現(xiàn)在被擴(kuò)展了梯浪,表示單詞嘛

[\d\D] 表示任何數(shù)字或非數(shù)字,就是說能匹配到任意的字符瓢娜。它跟.相比的話挂洛,這個(gè)同時(shí)還包括換行符。

例1:檢驗(yàn)已知文件中是否含有fred或者Fred字符眠砾,有的話就把這一行打印出來虏劲。

#! /usr/bin/perl
use warnings;
use strict;
while(<>){
   if(/(f|F)red/){
    print ; 
      }
     }

例2:找包含.的字符串,打印出來那一行。這里面相當(dāng)用了一個(gè)轉(zhuǎn)義符

#! /usr/bin/perl
use warnings;
use strict;
while(<>){
   if(/\./){
    print ;
      }
}

例3:打印那些有兩個(gè)相連且相同的非空字符的行柒巫。

#! /usr/bin/perl
use warnings;
use strict;
while(<>){
   if(/(\S)\1/){
    print ;
      }
      }

例4:打印出同時(shí)出現(xiàn)wilma以及fred的行(注意先后之別)

#! /usr/bin/perl
use warnings;
use strict;
while(<>){
 if (/wilma.*fred|fred.*wilma/){
   print;
     }
    }

9.Perl--用正則表達(dá)式進(jìn)行匹配

之前我們看到励堡,正則表示的寫法的時(shí)候用的是//,比如說/fred/堡掏,實(shí)際上這是m//的簡(jiǎn)寫应结,就像前面提到的數(shù)組qw//一樣。同樣的泉唁,m也可以任何成對(duì)或不成對(duì)的定界符摊趾,比如說m(fred).
我們可以選擇模式中不會(huì)出現(xiàn)的字符來作為定界符,比如/http:///游两,可以寫為m%http://%砾层。

常見的修飾符

/i 實(shí)現(xiàn)大小寫無(wú)關(guān)的匹配
/s 匹配任意字符 因?yàn)?不能匹配換行符,而加上這個(gè)后贱案,點(diǎn)號(hào)就能匹配任意的字符了
/x 容許在模式里隨意地加入空字符
/a 選擇ASCII碼作為解釋方式
/p 只會(huì)針對(duì)特定的正則表達(dá)式開啟類似自動(dòng)捕獲變量
/g 全局替換

寫法: if (/yes/i)
注意:#是注釋符號(hào)肛炮,如果需要用的話,可以加上\宝踪,或者[#]侨糟。
這些修飾符可以放在一起,放在模式末尾瘩燥,不必在意先后順序秕重。

Perl從5.14開始,有三種字符解釋方式厉膀,ASCII,Unicode,locale溶耘。下面的修飾符分別告訴采取何種方式解釋字符。
use5.014

/\w+/a #僅僅表示A-Z,a-z,0-9
/\w+/u #任何Unicode當(dāng)中定義為單詞的字符
/\w+/l #類似ASCII的版本服鹅,但單詞字符的定義取決于本地化定義
單個(gè)/a修飾符表示按照ASCII方式解釋簡(jiǎn)寫意義凳兵,如果使用兩個(gè)/a,則進(jìn)一步表示僅僅采用ASCII當(dāng)時(shí)的大小寫映射處理
/k/aai #只匹配ASCII字符K或k,但不匹配開爾文符號(hào)

錨位

通過給定錨位,我們可以讓模式僅在指定位置匹配

\A錨位匹配字符串的絕對(duì)開頭
\z錨位字符串的絕對(duì)末尾
\Z錨位字符串絕對(duì)末尾企软,但容許出現(xiàn)換行符
\b是單詞的邊界錨位庐扫,它能匹配任何的那次的首位
\B 非單詞邊界錨位,它能匹配所有\(zhòng)b不能匹配的位置仗哨。
^ 表示行首形庭, 表示末尾,加上m后可以錨定多行的位置厌漂, 比如/^fred/m /fred/m 分別表示錨位與多行的行首和行尾

=~綁定操作符

默認(rèn)情況下模式匹配的操作對(duì)象是_,而綁定操作符則是告訴perl萨醒,拿右邊的模式來匹配左邊的字符串,而不是匹配_
例如: if ($some_other=~/\brub/){
經(jīng)典的例子:

#! /usr/bin/perl -w
my $what="larry";
while(<>){
 if(/\A($what)/){
   print "We saw $waht in the beginning of $_";
    }
  }

這個(gè)例子中我比較喜歡$_桩卵,這個(gè)代表了輸入行验靡,自動(dòng)被存入的。同時(shí)還有變量的內(nèi)插雏节,當(dāng)然胜嗓,如果加上=^就更牛逼了

捕獲變量

變量$4的意思是模式中第4對(duì)括號(hào)所匹配的字符串內(nèi)容,這個(gè)內(nèi)容和模式運(yùn)行期間反向引用\4所表示的內(nèi)容是一樣的钩乍。但他們并非同一個(gè)事物的兩種名稱:\4反向引用是模式匹配期間得到的結(jié)果辞州,而$4則是匹配結(jié)束后所捕獲的內(nèi)容的索引。
if (/\s(a-zA-Z)+,/){  #捕獲的是空白符和逗號(hào)之間的單詞
   print $1;}         #$1為捕獲的第一個(gè)變量

這些捕獲的變量通常存活在下次匹配成功為止寥粹。如果需要在數(shù)行之外使用捕獲變量变过,通常最好的做法就是將它復(fù)制到某個(gè)普通變量里。
if (/\s(a-zA-Z)+,/){
my $wilma= $1;

不捕獲變量

有的時(shí)候涝涤,圓括號(hào)的加入僅僅是為了分組媚狰,所以要關(guān)閉它的捕獲功能,只需要在左括號(hào)的后面加上阔拳?:來告訴perl這一對(duì)圓括號(hào)完全是為了分組而存在的崭孤,把變量名留出來
例如: if (/(?:bronoto)?saurus(stedk|burger)/){ #這個(gè)里面$1為(stedk|burger)

命名捕獲

use 5.010
my $names='Fred or Barney';
if ($names=^m/(?\w+)(?:and|or)(?\w+)/){
  say "T sam $+{name1} and $+{name2}";
   }

看明白了嗎,通過(?PATTERN)糊肠,其中LABERL可以自行命名辨宠,再通過$+{LABEL}來捕獲它
在使用捕獲標(biāo)簽后,反向引用的用法也隨之改變货裹,之前我們用\1或者\(yùn)g{1}這樣的寫法嗤形,現(xiàn)在我們可以使用
\g{label}的寫法

自動(dòng)捕獲變量

$& 字符串實(shí)際匹配模式部分會(huì)被自動(dòng)存在
$` 匹配區(qū)段之前的的內(nèi)容存在
$' 匹配區(qū)段之后的內(nèi)容存在

但是呢,一旦用了這些自動(dòng)捕獲變量弧圆,其他正則表達(dá)式的運(yùn)行速度就會(huì)變慢赋兵。
我們可以將這個(gè)的命名改一下,一下的是在5.10或以上的版本中使用

$& ${^MATCH}來表示
$` ${^PREMATCH}
$' ${^POSTMATCH}

例如:

use 5.010;
if ("Hello,there,neighbor"=^/\s(\w+),/p){
  print "That actually matched '${^MATCH}'.\n"
   }

之前看到的三個(gè)量詞:* + ?
如果這三個(gè)量詞都不符合要求搔预,我們還可以使用花括號(hào){}形式指定具體的重復(fù)次數(shù)范圍毡惜。
例如 /a{5,15}/其為5到15次的a

優(yōu)先級(jí)

圓括號(hào)(分組或捕獲) (…)(?:…)(?…)
量詞 a*,a+,a?,a{n,m}
錨位和序列 abc,^,$,\A,\b,\z,\Z
折一豎線 a|b|c
原子 a,[abc],\d,\1,\g{2}
有的時(shí)候加上括號(hào)對(duì)弄清優(yōu)先級(jí)有好處,但是圓括號(hào)的使用同時(shí)也會(huì)有捕獲功能哦

例1:檢測(cè)斯撮,是否能匹配到match

#! /usr/bin/perl
while (<>){
 chomp;
 if(/(match)/){
   print "Matched: |$`<$&>$'|\n";
     }else{
    print "No match:|$_|\n";
    }
   }

例2:檢測(cè)以字母a結(jié)尾的單詞经伙,

#! /usr/bin/perl
use warnings;
use strict;
while (<>){
   chomp;
   if (/a\z/){
       print;
      }
      }

例3:以上面的為例子,將其存儲(chǔ)在$1里

#! /usr/bin/perl
use warnings;
use strict;
while(<>){
   chomp;
   if (/([\d\D]+a\z)/){
   print "\$1 contains $1\n";
    }
    }

例4:接著上題勿锅,使用命名捕獲

#! /usr/bin/perl
use warnings;
use strict;
while (<>){
    chomp;
  if (/(?[\d\D]*a\z)/){
    print "'word' contains $+{name}\n";
    }
    }

例5:定位以a結(jié)尾帕膜,但是再將之后的5個(gè)字符捕獲至一個(gè)獨(dú)立的內(nèi)存變量

#! /usr/bin/perl
use warnings;
use strict;
while (<>){
    chomp;
  if (/(?[\d\D]*a)(?\s[\d\D]{4})/){
    print "$+{name1} $+{name2}\n";
    }
    }

例6:輸出以空白結(jié)尾的行

#! /usr/bin/perl
use warnings;
use strict;
while (<>){
    chomp;
  if (/([\d\D]*\s\z)/){
    print "$1 m\n";
    }
    }

10.Perl--正則表達(dá)式處理文本

如果m//模式匹配現(xiàn)象成文字處理器的“查找”功能,那么s///替換操作符就是“查找并替換”功能溢十。
_="green scaly dinosaur"; s/(\w+)(\w+)/2,1/g; #替換后為“scaly,green dinosaur” 上面的例子中/g為全局替換垮刹。我們?cè)诳s減空白的時(shí)候,可以這么做: s/^s+// ; #將開頭的空白替換成空字符串 s/s+//; #將結(jié)尾的空白替換為空字符串
也可以這么寫: s/^\s+|\s+$//g; 去除開頭和結(jié)尾的空白符

s///也可以采用不同的定界符张弛,但是如果是有左右之分的話荒典,就必須成對(duì)使用酪劫。比如s{fred}{barney}
同時(shí)我們也可以使用之前提到的修飾符,順序無(wú)限后寺董,比如/i,/x,/s

下面是正則表達(dá)式中的一些常用模式覆糟。

/pattern/ 結(jié)果
. 匹配除換行符以外的所有字符
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] 匹配所有小寫字母字符
[^0-9] 匹配所有非數(shù)字字符
[^a-z] 匹配所有非小寫字母字符
^ 匹配字符開頭的字符
$ 匹配字符結(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/i i 這個(gè)參數(shù)表示忽略英文大小寫,也就是在匹配字符串的時(shí)候饵筑,不考慮英文的大小寫問題埃篓。
\ 如果要在 pattern 模式中找尋一個(gè)特殊字符,如 "*"根资,則要在這個(gè)字符前加上 \ 符號(hào)架专,這樣才會(huì)讓特殊字符失效

下面給出一些例子:

范例 說明
/perl/ 找到含有 perl 的字符串
/^perl/ 找到開頭是 perl 的字符串
/perl$/ 找到結(jié)尾是 perl 的字符串
/c|g|i/ 找到含有 c 或 g 或 i 的字符串
/cg{2,4}i/ 找到 c 后面跟著 2個(gè)到 4個(gè) g ,再跟著 i 的字符串
/cg{2,}i/ 找到 c 后面跟著 2個(gè)以上 g 玄帕,再跟著 i 的字符串
/cg{2}i/ 找到 c 后面跟著 2個(gè) g部脚,再跟著 i 的字符串
/cg*i/ 找到 c 后面跟著 0個(gè)或多個(gè) g ,再跟著 i 的字符串裤纹,如同/cg{0,1}i/
/cg+i/ 找到 c 后面跟著一個(gè)以上 g委刘,再跟著 i 的字符串,如同/cg{1,}i/
/cg?i/ 找到 c 后面跟著 0個(gè)或是 1個(gè) g 鹰椒,再跟著 i 的字符串锡移,如同/cg{0,1}i/
/c.i/ 找到 c 后面跟著一個(gè)任意字符,再跟著 i 的字符串
/c..i/ 找到 c 后面跟著二個(gè)任意字符漆际,再跟著 i 的字符串
/[cgi]/ 找到符合有這三個(gè)字符任意一個(gè)的字符串
/[^cgi]/ 找到?jīng)]有這三個(gè)字符中任意一個(gè)的字符串
/\d/ 找尋符合數(shù)字的字符淆珊,可以使用/\d+/來表示一個(gè)或是多個(gè)數(shù)字組成的字符串
/\D/ 找尋符合不是數(shù)字的字符,可以使用/\D+/來表示一個(gè)或是更多個(gè)非數(shù)字組成的字符串
/*/ 找尋符合 * 這個(gè)字符奸汇,因?yàn)?* 在常規(guī)表達(dá)式中有它的特殊意思施符,所以要在這個(gè)特殊符號(hào)前加上 \ 符號(hào)往声,這樣才會(huì)讓這個(gè)特殊字符失效
/abc/i 找尋符合 abc 的字符串而且不考慮這些字符串的大小寫

無(wú)損替換

(my copy =original)=^s/\d+ribs?/10 ribs/;
也可以在修飾符r的作用下這么使用
use 5014;
my copy =original=^s/\d+ribs?/10 ribs/r;

大小寫的轉(zhuǎn)換:

\U 將其后的所有字符轉(zhuǎn)換成大寫
\L 將后面的所有字符轉(zhuǎn)換成小寫
\E 關(guān)閉大小寫的功能
\l \u 小寫的形式僅僅影響后面跟的第一個(gè)字符
\u\L 表示首字母大寫,后面的字符全部小寫戳吝,順序無(wú)先后

例子: s/(\w+) with (\w+)/\U2\E with1/i; 這個(gè)例子中僅僅對(duì)$2大寫浩销,其后的不變。

split操作符

根據(jù)模式來拆分字符串骨坑;
my @fields =split /separator/,string; 期間只要模式在某處匹配成功撼嗓,該處就是當(dāng)前字段的結(jié)尾柬采,下一個(gè)字段的開頭欢唾。 my @fields =split /:/,"abc:def:g:h"; #得到的是("abc","def","g","h") 如果是兩個(gè)分隔符在一起,就會(huì)產(chǎn)生空字段粉捻,保留開頭處的空字段礁遣,舍棄結(jié)尾處的空字段。 my @fields =split #等效于my @fields =split /\s+/,_;

join函數(shù)

它的功能和split相反肩刃,它可以把這些片段連接成一個(gè)字符串
my result= joinglue,@pieces;
例如 my x=join ":",4,6,8,10,12; #x為“4:6:8:10:12”

在列表上下文中使用模式匹配操作符(m//)時(shí)祟霍,如果匹配成功,那么返回的是所有捕獲變量的列表盈包;如果匹配失敗沸呐,則返回的是空列表

my $data ="Barney Rubble Fred Flintstone Wilma Flintstone"
my @words=($data=~/(\w+)\s+(\w+)/g);
my $words=($data=~/(\w+)\s+(\w+)/g);

你看 ,這樣就可以將標(biāo)量變成數(shù)組或哈希了呢燥。

I thought you said Fred and Velma,notWilma
可以這樣來 s#(.*?)#$1#g; 如果不加問號(hào)的話崭添,就只有一個(gè)結(jié)果,加了以后才能有兩個(gè)

把整個(gè)文件讀進(jìn)一個(gè)變量叛氨,然后把文件名作為每一行的前綴呼渣。

open FILE,$filename
   or die "Can't open '$filename':$!";
 my $lines=join '',;
$LINES=~s/^/$filename:/gm;

從命令行直接編輯
在終端中輸入 :$perl -p -i.bak -w -e 's/RANDALL/RANDAL/g' fred*.dat
這個(gè)就相當(dāng)于:

#! /usr/bin/perl -w
$^I=".bak";
while(<>){
 s/RANDALL/RANDAL/g;
 print;
}

-p讓perl自動(dòng)生成一段小程序寞埠, -i相當(dāng)于$^I設(shè)為.bak屁置,如果不想備份文件的話,可以直接寫-i仁连;-w警告功能蓝角;-e后面跟著的是可執(zhí)行的程序代碼

例1:匹配3個(gè)$what

#! /usr/bin/perl
use warnings;
use strict;
my $what='fred|barney';
while (<>){
    chomp;
     if (/($what){3}/){
     print "$_\n";
      } 
     }

例2:將Fred換成Larry,同時(shí)輸出文件名為*.out

#! /usr/bin/perl
use warnings;
use strict;
while(<>){
chomp;
s/Fred/Larry/ig;
print "$_\n";
}

根據(jù)上面的程序即可,同時(shí)在使用的時(shí)候 : perl 程序名 <文件名> 生成的文件名.out
當(dāng)然也可以指定輸出饭冬,但是我覺得太麻煩了帅容,就算了吧

例3:將Fred和Barney互換

#! /usr/bin/perl
use warnings;
use strict;
while(<>){
chomp;
s/Fred/Larry/ig;
s/barney/Fred/ig;
s/Larry/Barney/ig;
print "$_\n";
}

例4:在開始前加文本申明:

#! /usr/bin/perl
use warnings;
use strict;
$^I=".bak";
while(<>){
  s/\A\#/## Copyright (C) 2013 by Sam \n\#/;
  print;
   }

歡迎關(guān)注oddxix

有趣的靈魂等著你~

如果覺得寫的不錯(cuò)記得點(diǎn)個(gè)贊哦~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市伍伤,隨后出現(xiàn)的幾起案子并徘,更是在濱河造成了極大的恐慌,老刑警劉巖扰魂,帶你破解...
    沈念sama閱讀 206,013評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件麦乞,死亡現(xiàn)場(chǎng)離奇詭異蕴茴,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)姐直,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門倦淀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人声畏,你說我怎么就攤上這事撞叽。” “怎么了插龄?”我有些...
    開封第一講書人閱讀 152,370評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵愿棋,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我均牢,道長(zhǎng)糠雨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,168評(píng)論 1 278
  • 正文 為了忘掉前任徘跪,我火速辦了婚禮甘邀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘垮庐。我一直安慰自己松邪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評(píng)論 5 371
  • 文/花漫 我一把揭開白布哨查。 她就那樣靜靜地躺著逗抑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪解恰。 梳的紋絲不亂的頭發(fā)上锋八,一...
    開封第一講書人閱讀 48,954評(píng)論 1 283
  • 那天,我揣著相機(jī)與錄音护盈,去河邊找鬼挟纱。 笑死,一個(gè)胖子當(dāng)著我的面吹牛腐宋,可吹牛的內(nèi)容都是我干的紊服。 我是一名探鬼主播,決...
    沈念sama閱讀 38,271評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼胸竞,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼欺嗤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起卫枝,我...
    開封第一講書人閱讀 36,916評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤煎饼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后校赤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吆玖,經(jīng)...
    沈念sama閱讀 43,382評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡筒溃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了沾乘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怜奖。...
    茶點(diǎn)故事閱讀 37,989評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖翅阵,靈堂內(nèi)的尸體忽然破棺而出歪玲,到底是詐尸還是另有隱情,我是刑警寧澤掷匠,帶...
    沈念sama閱讀 33,624評(píng)論 4 322
  • 正文 年R本政府宣布滥崩,位于F島的核電站,受9級(jí)特大地震影響槐雾,放射性物質(zhì)發(fā)生泄漏夭委。R本人自食惡果不足惜幅狮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評(píng)論 3 307
  • 文/蒙蒙 一募强、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧崇摄,春花似錦擎值、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至厕氨,卻和暖如春进每,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背命斧。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評(píng)論 1 260
  • 我被黑心中介騙來泰國(guó)打工田晚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人国葬。 一個(gè)月前我還...
    沈念sama閱讀 45,401評(píng)論 2 352
  • 正文 我出身青樓贤徒,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親汇四。 傳聞我的和親對(duì)象是個(gè)殘疾皇子接奈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 隨著年復(fù)一年的淡而無(wú)味的春節(jié),除了雞鴨魚肉等擺滿桌通孽,在春晚作為背景音下的大家刷手機(jī)的百態(tài)表現(xiàn)序宦,海壇特哥在除夕夜告白...
    a83b5b0cc170閱讀 198評(píng)論 0 0
  • 一兩愿你江南多雨帶油傘, 二兩愿你酷暑可以輕搖扇背苦, 三兩愿你無(wú)病無(wú)憂心常寬互捌, 三兩三堡僻,余下三。 我在這里疫剃,一關(guān)接一...
    墨語(yǔ)涵閱讀 257評(píng)論 3 1
  • 數(shù)據(jù)科學(xué)是什么 數(shù)據(jù)挖掘钉疫、機(jī)器學(xué)習(xí)、人工智能都是數(shù)據(jù)科學(xué)的一個(gè)分類巢价。 接下來牲阁,我們從這幾個(gè)方面來剖析一下數(shù)據(jù)科學(xué) ...
    地主是我爸閱讀 294評(píng)論 0 1