Perl 语言入门6-9
---- 第6章 哈希-----------
簡介
鍵值對。鍵和值都是任意標量,但鍵總是會被轉換成字符串。
鍵唯一,值可重復。
應用場景:一組數據對應到另一組數據時。 如找出重復/唯一/交叉引用/查表等
訪問哈希元素
$name{'fred'} = 'peng'; $name{'barney'} = 'guo'; foreach my $person (qw(barney fred)){print "you are $person $name{$person}.\n"; }#胖箭頭 my %hash = ('red' => 'peng', #鍵的引號一般可省去'blue' => 'guo','green' => 'bai', );訪問整個哈希
%hash = (12,"you",4,"are"); @array = %hash; print "@array\n" #元素順序會變哈希賦值
my %new_hash = %old _hash; #兩個hash順序不一定完全相同 my %hash = reverse %oldhash; #反轉鍵值對,適用于鍵值都唯一的哈希,如主機名和IP哈希函數
- keys函數返回鍵列表
- values函數返回值列表
- each函數迭代哈希,返回鍵值對
- exists函數:檢查哈希中是否存在某個鍵
- delete函數:從哈希中刪除指定鍵及其對應的值
哈希元素內插
foreach my $person (sort keys %books){if(exists $book{$person}){print "$person has $book{$person}\n";} }- %ENV哈希: 即PATH(環境變量)對應的值(路徑)
print "PATH is $ENV{PATH}\n";
--------- 第七章 正則表達式----------
簡介
簡單模式
默認匹配對象$_,則只要/chracter/即可
$_ = "abdgewgaegggea"; if(/dge/) {print "It matched\n";}模式匹配通常用來返回真假,所以常用于while/if等條件中。
轉義符/制表符等同樣可以用于模式串中。
元字符
點號(.):匹配任意一個除換行符外的字符 (沒有或超過一個都不行)。
在任何元字符前加上反斜線即失去元字符的作用。如/3\.14/
簡單量詞
* 星號:匹配前面的0個或多個 .* :匹配0到多個字符 + 加號: 匹配一個或多個 ? 問號:匹配0個或1個模式分組
用小括號對字符串分組,如/(fred)+/
反向引用捕獲組:引用小括號中所匹配的字符,\1,\2
擇一匹配
/fred(|\t)+barney/
/fred(or|and)barney/
字符集
一個好的正則模式應只匹配到需要的那些字符,不留一點多余。
[a-zA-Z] #[]匹配其中任何**一個**字符。 $_ = " The HAL-9298 requres"; if (/HAL-[0-9]+/)#脫字符^,表不匹配 [^def] [^n\-z] #\轉義#字符集的簡寫\d 數字: 近似于[0-9] \s 空白符:包括換頁符/制表符/換行符/回車符/空格,即等于[\f\t\n\r] \w 單詞字符(字母數字下劃線):相當于[a-zA-Z0-9_]# 反義的簡寫 \D:即[^\d] \W:即[^\w] \S:即[^\s][\d\D] 匹配任何字符(包括換行符),比點號還廣(不包括換行符)----------- 第八章 正則匹配-----
匹配
m//或m##等,省略為//或## 等
模式匹配修飾符
/i 忽略大小寫 if(/yes/i) /s 匹配任意字符 #(一般用于含換行符的字符串)if(/barney.*fred/s)/x 加入空白符 #(使之更加易讀)if(/ -? [0-9]+ \.? [0-9]* /x) #還能添加注釋:當然注釋中不能含有/等定界符,否則視為模式終點/-? #0或1個-[0-9]+ #至少1個數字\.? #0或1個.[0-9]* #至少0個數字/x #字符串末尾if(/barney.*fred/is) 組合修飾符,與順序無關字符串錨位(右斜線)
\A 錨位字符串開頭 m{\Ahttps?://}i \z 錨位字符串末尾 m{\.png\z}i \Z 行末錨位,即在錨位字符串末尾但允許后面出現換行符 /\.png\Z/ /\A\s*\Z/ 組合匹配一個空行但最習慣的還是用脫字符^ $來錨位行的首尾。 行的首尾和字符串的首尾有一點區別:字符串有可能是多行。 但即使這樣,我們仍傾向于用^$,只需后面加個修飾符/m即可。/^barney/m #等于/\Abarney\Z/單詞錨位
\b 匹配單詞的首尾,整詞匹配. /\bfred\b/ \B 非單詞邊界錨位。/\bsearch\B/ 匹配searching等綁定操作符
模式匹配默認對象是$_,用 =~ 拿右邊的模式來匹配左邊的字符串。
my $some = "this is a string"; if($some =~ /\bstr/){print "yes\n";}捕獲變量
$1,$2,$3...類似反向引用的\1,\2,\3...,但反向引用是模式匹配期間的結果,而捕獲變量是匹配結束后捕獲內容的索引。
$_ = "hello there, neighbor"; if(/\s(\[a-zA-Z]+),/){ #匹配空白符和逗號間的單詞print "the word was $1\n"; }if(/(\S+) (\S+), (\S+)/){print "words are $1 $2 $3\n"; }my $names = 'fred or barney'; if($names =~ /(\w+) (or|and) (\w+)/){say "I saw $1 and $3"; }捕獲變量的存續期
匹配才改變內容,不匹配還是原來的內容
if($pjx =~ /([a-zA-Z]+)/){print "pjx is $1\n"; }else{print "pjx have no word\n"; }#復制給變量長期使用 if($pjx =~ /([a-zA-Z]+)/){my $var = $1;... }不捕獲模式?:
# 用?:來表示這對括號內只是分組,而非捕獲 if(/(?:bronto)?sarus (steak|buger)/){print "Fred wants a $1\n"; #捕獲第二個括號 } #建議盡可能用非捕獲括號來分組自動捕獲變量
速度拖慢,常用于正則表達式中的替換操作
$& 匹配內容 $` 匹配區段前的內容 $' 匹配區段后的內容if("hello there, neighbor" =~ /\s(\w+),/){print "that was $` $& $'.\n"; #分別對應原三個單詞 }通用量詞
/a{5,10}/ #匹配5-10個a /(fred){3,}/ #匹配3個以上fred /(ged){8}/ #剛好匹配8個--------- 第九章 用正則表達式處理文本 -----
s///替換
$_ = "he's out bowling with barney tonight"; s/barney/fred/; print "$_\n"; s/with (\w+)/against $1's team/; #替換為捕獲 print "$_\n";if(s/out/in/) #返回布爾值# 除s//外,其他定界符 非成對字符 s#^https://#http://#; 成對字符 s{fred}{barney}; s<fred>(barney)/g全局替換
$_ = "home, sweet home!"; s/home/cave/g; print "$_\n";#常用于縮減空白 $_ = "input data\t may have extra whitespace"; s/\s+/ /g;#刪除開頭和結尾的空白 s/^\s+//; s/\s+$//; s/^\s+|\s+$//g; #一次到位#其他替換修飾符 /i 無關大小寫 s/wilma/WILMA/gi /x 加入任何空白 /s 任意字符(包括換行)綁定操作符
$file_name =~ s/^.*//s;
無損替換
同時保留原始的和替換后的字符串
my $original = 'fred ate 1 rib'; my $original2 = 'fred ate 1 rib'; (my $copy = $original) =~ s/\d+ ribs?/10 ribs/; #加括號先賦值后替換,返回成功替換的次數?? my $copy2 = $original2 =~ s/\d+ ribs?/10 ribs/r; #不加括號先替換后賦值,加\r修飾符,返回替換的結果?? print "$original\n$copy\n"; print "$original2\n$copy2\n";#輸出結果一樣啊: fred ate 1 rib fred ate 10 ribs fred ate 1 rib fred ate 10 ribs大小寫轉換
\U 其后所有字符轉換成大寫 \L 其后所有字符轉換成小寫 \u 其后第一個字符轉換成大寫 \l 其后第一個字符轉換成小寫 \E 關閉大小寫轉換$_ = "I saw Barney with Fred."; s/(fred|barney)/\U$1/gi; s/(fred|barney)/\L$1/gi; s/(\w+) with (\w+)/\U$2\E with $1/i; s/(fred|barney)/\u$1/gi; s/(fred|barney)/\u\L$1/gi; #首字母大寫#注:以上轉換方法同樣可用在任何雙引號內的字符串: print "\L\u$name\E, are you ok?";split操作符
my @files = split /\s+/, $_; #等同于split/\s+/ my @files = split/\t/, $_, 2; #只拆分為2段my @fields = split/:/, "ab:db::e"; # 會產生一個空字段 my @fields = split /:/, "::ab:cd:::"; #前面的空字段保留,后面的會省去join函數
與split相反
my $result = join $glue, @pieces; #glue可以是任意字符串 my $x = join ";", 4,6,7,8,9; # 4;6;7;8;9 my $y = join "foo", "bar,gre"; #barfoogre my @value = split /;/, $x; my $z = join "-", @value; #4-6-7-8-9列表上下文中的匹配
不要與上面的s///(返回次數)混淆了
my $text = "fred a 5 ton Mr. Slate"; my @words = ($text =~ /([a-z]+)/ig); print "result: @words\n"; #fred a ton Mr Slatemy $data = "barney rubble fred Flid Wilm fint"; my %name = ($data =~ /(\w+)\s+(\w+)/g); #每次捕獲一對值,生成hash鍵值對非貪婪量詞
$test = "this the is a the is a test"; $test =~ s/the (.*?) a/$1/g;+? *? {5,10}? {8,}? ?? #問號本身的非貪婪,即在0或1的情況下匹配0次跨行模式匹配
/m
Perl時間函數
my $date = `date`; my $date = localtime;轉載于:https://www.cnblogs.com/jessepeng/p/10962651.html
總結
以上是生活随笔為你收集整理的Perl 语言入门6-9的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 尚学python课程---11、linu
- 下一篇: lua加载DLL