[精讚] [會員登入]
269

Perl 的列舉寫法(map list)

使用列舉的寫法來設定陣列,非常的強大

此文完整連結 http://n.sfs.tw/13017

複製連結 Perl 的列舉寫法(map list)@新精讚
(文章歡迎轉載,務必尊重版權註明連結來源)
2019-10-20 10:07:30 最後編修
2019-01-08 16:28:56 By 張○○
 

自動目錄

Perl 的 map 是非常強但是不容易理解的東西,很抽象。

map 的語法

map BLOCK LIST

map EXPR, LIST

map(BLOCK LIST) 函式寫法

map(EXPR, LIST) 函式寫法

EXPR可以是子函數名、正則表達式等,BLOCK是由大刮號包起來的區塊。LIST是輸入列表或陣列。

函式寫法適用於後置表達式或是為了容易閱讀。

簡單地說,map就是起了一個替代 foreach 循環的作用,map會把LIST中的元素一個個取出,放到系統變量$_中,然後調用 BLOCK/EXPR 去處理。

處理過的結果由map函數返回,成為一個新的LIST。

看不懂對吧?!

請看範例:

EXAMPLE1. 將清單中的數值開根號*10

my @arr = map { sqrt($_)*10 } qw/50 70 100 91 18/;
print "@arr"; #70.7106781186548 83.6660026534076 100 
# 95.3939201416946 42.4264068711928

 

EXAMPLE2. 將 0-9 平方後丟到 @arr中

my @arr = map { $_ ** 2 } (0..9);
print "@arr";  #0 1 4 9 16 25 36 49 64 81

 

EXAMPLE3. 將清單加上網域

@user= (' axer', 'john', 'peter', 'lee');
@mail = map {  $_ .  '@n.sfs.tw' } @user;

第2行 這裡的 '@n.sfs.tw' 是以單引號括起,否則用雙引號會把 @n 視為陣列
結果 @mail = qw( axer@n.sfs.tw john@n.sfs.tw peter@n.sfs.tw lee@n.sfs.tw );

 

EXAMPLE4. 使用取代,自己被改變

使用tr大小寫互換,相關說明可以參考 [PERL] 16-字串取代和置換

@m=("Wwww",  "Facility", "Mail");
map { tr/a-zA-Z/A-Za-z/ } @m;
print "@m\n"; #wWWW fACILITY mAIL

或是使用s作取代,下例map 將@m 陣列中的字串空白移除

@m=("   www",  "facility ", " mail ");
map { s/\s+//g } @m;
print "@m"; #www facility mail

@m 本身被改變

 

EXAMPLE5. 使用副程式EXPR,把字符取代掉

把oO換成0,q換成9,il換成1、t換成7,然後首字大寫。

@m=("who",  "facility", "Mail");

map &encryptwords, @m;
print "@m\n";

sub encryptwords{
  tr/oOqilt/009117/;
  $_=ucfirst($_);
}

第3行 使用副程式 encryptwords 來處理,注意副程式前面有一個'&';後面有一個逗點 ','

第4行執行結果 Wh0 Fac1117y Ma11

6-9行 副程式,如果忘了副程式可參考 [PERL] 12- 副程式

 

EXAMPLE6. 使用內建函式把首字大寫

@m=("who",  "facility", "Mail");
@m=map ucfirst, @m;

第2行 很精簡的一行

 

EXAMPLE7. 使用map篩選連續的鹼基

篩選出有連續的鹼基,例如 AAC TAA GAA....

@aminos = qw(
TCA  TCC  TCG  TCT  TTC  TTT  TTA  TTG  TAC  TAT  TAA  TAG  
TGC  TGT  TGA  TGG  CTA  CTC  CTG  CTT  CCA  CCC  CCG  CCT  
CAC  CAT  CAA  CAG  CGA  CGC  CGG  CGT  ATA  ATC  ATT  ATG  
ACA  ACC  ACG  ACT  AAC  AAT  AAA  AAG  AGC  AGT  AGA  AGG  
GTA  GTC  GTG  GTT  GCA  GCC  GCG  GCT  GAC  GAT  GAA  GAG  
GGA  GGC  GGG  GGT
);

@m=map  /(.)\1/?$_:(), @aminos;
print "@m\n";

執行結果

TCC TTC TTT TTA TTG TAA TGG CTT CCA CCC CCG CCT CAA CGG ATT ACC AAC AAT AAA AAG AGG GTT GCC GAA GGA GGC GGG GGT

第10行 使用正則表達式,比對連續出現的字母,如果比對成功,把比對的結果加到@m,否則略過。map中要略過使用空的小刮號 '()'。

請注意寫法,因為是表達式,所以不能省略那個逗號,否則會出現語法錯誤。這個式其實是這個意思:

foreach(@aminos){
  $_ =~ /(.)\1/?$_:();
}

只是省略了比對的運算。你也可以寫成區塊的型式,結果會一樣

@m=map { /(.)\1/?$_:()} @aminos;

 

結論

-- 熟析map用法可以省略非常多的步驟和程式碼,非常強大。

-- LIST也可以放入雜湊。

-- tr///和s///會換掉原來的LIST


重寫原文 2009-11-16 10:22:00

你可能感興趣的文章

[PERL] 20- 檔案目錄處理 PERL寫入和讀出檔案

自行撰寫syslog server建立資訊安全控管中心#1 -- 前言及syslog介紹 利用PERL將syslog收攏到資料庫的程式

[PERL] 09-迴圈 perl的迴圈

[PERL] 11- 雜湊的範例 Perl 的幾個雜湊範例

[PERL] 08-陣列 #2 --操作 更多perl陣列的操作,如拆開、黏合、取出、加入等等

[PERL] 12- 副程式 Perl 的副程式就是所謂的函數

[PERL] 06-運算子 #2 PERL的運算子介紹,總共有21種

PERL一次讀取檔案所有內容的方法($/) perl可以使用slurp mode一次讀完檔案所有內容的方法及一些範例

[PERL] 可用中文取名的中文名函式和package 原來perl 也可以用中文當函式、類別、方法的名稱啊

關於Perl,你得知道這幾點 Perl 有不少奇異的地方,值得看一看

我有話要說


限制:留言最高字數1000字,超過部分會被截掉。請注意:留言不可帶有網址,會被濾掉。 限制:未登入訪客,每則留言間隔需超過10分鐘,每日最多5則留言。

訪客留言

[無留言]

隨機好文

[CodeIgniter3] 解決無法上傳特定檔案(.sb2)的問題 上傳時出現The filetype you are attempting to upload is not allowed,要怎麼解決?

外匯課程經驗 有天遇到某個朋友的正妹朋友,說她有個很棒的外匯投資課程,要我們去聽,只收場地費200大洋。她又說續效最差一個月也有1%,誰還在苦哈哈上班?

[Apache] 自訂錯誤頁面及移掉歡迎頁 Apache 有一個歡迎頁,以正式網站來說,出現這頁有點不專業,該移除它..

安裝網頁套件管理程式 Bower 一個非常棒的Javascript套件管理程式bower,用完愛不釋手。

銷售的困難點--庫存 銷售時,商人加上自己的利潤和風險,作為商品的售價,進貨面臨的問題會是什麼?