2012年9月26日 星期三

[ Perl 函數 ] split : 根據 Pattern 切割字串

來源自 這裡 
說明 : 
split 是 Perl 中非常有用的函式之一,它可以將一個字串分割並將之置於陣列中。若無特別的指定,該函式亦使用 RE 與 $_ 變數 

語法 : 
* split /PATTERN/,EXPR,LIMIT
* split /PATTERN/,EXPR
* split /PATTERN/

如果 PATTERN 有給, EXPR 預設是 $_; 如果 PATTERN 是空字串, 則 EXPR 會被切割成以字元為單位的陣列. 範例如下: 
  1. print join(':', split(''"abc"));  
輸出為 : 
a:b:c

使用範例 : 
底下為此函數的使用範例. 

- Example 1. Splitting by a special character 
對句子使用特定字元進行切割 : 
  1. #!/usr/bin/perl  
  2.   
  3.   use strict;  
  4.   use warnings;  
  5.   
  6.   my $data = 'Becky Alcorn,25,female,Melbourne';  
  7.   
  8.   my @values = split(',', $data);  
  9.   
  10.   foreach my $val (@values) {  
  11.     print "$val\n";  
  12.   }  
  13.   
  14.   exit 0;  
執行結果 : 
Becky Alcorn
25
female
Melbourne

- Example 2. Splitting by a string 
底下使用字串 '~~~' 進行切割 : 
  1. #!/usr/bin/perl  
  2.   
  3. use strict;  
  4. use warnings;  
  5.   
  6. my $data = 'Bob the Builder~~~10:30am~~~1,6~~~ABC';  
  7. my @values = split('~~~', $data);  
  8.   
  9. foreach my $val (@values)   
  10. {  
  11.     print "$val\n";  
  12. }  
  13.   
  14. exit 0;  
執行結果 : 
Bob the Builder
10:30am
1,6
ABC

- Example 3. Splitting on a pattern 
PATTERN 可以使用 RE 來定義更廣泛的 separator, 底下使用 "\\d+" 將所有不定長度的數字當作 separator: 
  1. #!/usr/bin/perl  
  2.   
  3. use strict;  
  4. use warnings;  
  5.   
  6. my $data = 'Home1Work2Cafe3Work4Home';  
  7.   
  8. # \d+ matches one or more integer numbers  
  9. my @values = split(/\d+/, $data);  
  10.   
  11. foreach my $val (@values)   
  12. {  
  13.     print "$val\n";  
  14. }  
  15. exit 0;  
執行結果 : 
Home
Work
Cafe
Work
Home

- Example 4. Splitting on an undefined value 
如果 PATTERN 為 undef, 則會將字串切割為字元的陣列: 
  1. #!/usr/bin/perl  
  2.   
  3. my $data = 'Becky Alcorn';  
  4.   
  5. my @values = split(undef,$data);  
  6.   
  7. foreach my $val (@values) {  
  8.     print "$val\n";  
  9. }  
  10.   
  11. exit 0;  
執行結果 : 
B
e
c
k
y

A
l
c
o
r
n

- Example 5. Splitting on a space 
如果你使用 ' ' 來進行切割, 會類似使用 RE 的 /\s+/. 包含斷行, Tab 都會被當作 separator: 
  1. #!/usr/bin/perl  
  2. use strict;  
  3. use warnings;  
  4.   
  5. my $data = "Becky\n\nAlcorn";  
  6. my @values = split(' ',$data);  
  7.   
  8. # Print 'aa' either side of the value, so we can see where it split  
  9. foreach my $val (@values) {  
  10.     print "aa${val}aa\n";  
  11. }  
  12. exit 0;  
執行結果 : 
aaBeckyaa
aaAlcornaa

如果你"真的"希望只用空白當作 separator, 可以考慮下面代碼: 
  1. my @values = split(/ /,$data);  
- Example 7. Split and context 
如果你沒有給任何參數, split 會對 $_ 使用 ' ' 當作 separator 進行切割: 
  1. #!/usr/bin/perl  
  2. use strict;  
  3. use warnings;  
  4.   
  5. foreach ("%%Bob\tthe Builder%%""%%Thomas\nthe TankEngine%%"'%%B1 and B2%%')   
  6. {  
  7.     my @values = split;  
  8.     print "Split $_:\n";  
  9.     foreach my $val (@values)   
  10.     {  
  11.         print "--$val\n";  
  12.     }  
  13. }    
  14.   
  15. exit 0;  
執行結果: 
Split %%Bob the Builder%%:
--%%Bob
--the
--Builder%%
Split %%Thomas
the TankEngine%%:
--%%Thomas
--the
--TankEngine%%
Split %%B1 and B2%%:
--%%B1
--and
--B2%%

- Example 8. Limiting the split 
你也可以透過 LIMIT 參數決定最多切出多少個單位 (LIMIT=2 意味只切一次.), 下面代碼最多只會切割 2 次: 
  1. #!/usr/bin/perl  
  2. use strict;  
  3. use warnings;  
  4.   
  5. my $data = 'Becky Alcorn,25,female,Melbourne';  
  6.   
  7. my @values = split(',', $data, 3);  
  8.   
  9. foreach my $val (@values)   
  10. {  
  11.     print "$val\n";  
  12. }  
  13. exit 0;  
執行結果: 
Becky Alcorn
25
female,Melbourne

- Example 9. Keeping the delimiter 
如果你在切割後想要保留 separator, 可以使用 '(' 與 ')' 將 separator 中要保留的部分括起來. 下面代碼會保留 separator 的第一個數字: 
  1. #!/usr/bin/perl  
  2. use strict;  
  3. use warnings;  
  4.   
  5. my $data = 'Home1Work22Cafe333Work4444Home';  
  6. # \d+ matches one or more integer numbers  
  7. # The parenthesis () mean we keep the digits we match  
  8. my @values = split(/(\d)+/, $data);  
  9.   
  10. foreach my $val (@values)   
  11. {  
  12.     print "$val\n";  
  13. }  
  14. exit 0;  
執行結果: 
Home
1
Work
2
Cafe
3
Work
4
Home

- Example 10. Splitting into a hash 
如果已知道你的輸入字串是平衡的, 你可以直接將輸出轉成 hash. 參考範例如下: 
  1. #!/usr/bin/perl  
  2. use strict;  
  3. use warnings;  
  4.   
  5. my $data = 'FIRSTFIELD=1;SECONDFIELD=2;THIRDFIELD=3';  
  6. my %values =  split(/[=;]/, $data);  
  7.   
  8. foreach my $k (keys %values)   
  9. {  
  10.     print "$k: $values{$k}\n";  
  11. }  
  12. exit 0;  
執行結果為: 
FIRSTFIELD: 1
THIRDFIELD: 3
SECONDFIELD: 2


補充說明 : 
perldoc.perl.org - split 
Using the Perl split() function

沒有留言:

張貼留言

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...