2010-01-11 105 views
1

我正在學習split function的示例代碼。分割功能擴展

示例代碼。

#!C:\Perl\bin\perl.exe 
use strict; 
use warnings; 

my $info = "Caine:Michael:Actor:14, Leafy Drive"; 
my @personal = split(/:/, $info); 
# @personal = ("Caine", "Michael", "Actor", "14, Leafy Drive"); 

如果改變$info = "Caine Michael Actor /* info data */"; 如何使用split(/ /, $info)導出結果如下。

# @personal = ("Caine", "Michael", "Actor", "info data"); 

謝謝。

+4

之間的所有內容。你試過什麼了? – Ether 2010-01-11 07:45:53

+0

嗨醚,也許我發佈了一個愚蠢的問題。我的項目仍然有些困難。有時我不知道如何分析我的問題,也許我已經錯誤地發佈了我的問題。 :-)我只是嘗試了錯誤的方式,然後我會回頭尋找另一種方式。這是我非常愚蠢的學習方法。 – 2010-01-11 08:04:08

+1

是否有充分的理由使用空格作爲分隔符?下面的代碼示例表明模糊會造成複雜性。通常的做法是「逃避」分隔符,例如使用反斜槓 – 2010-01-11 08:10:42

回答

0

煮熟了:)。只爲你工作的例子。不能一概而論

use strict; 
use warnings; 

my $info = "Caine Michael Actor /* info data */"; 
if($info=~m{/\*\s*(.*?)\s*\*/}) 
{ 
    my $temp = $1; 
    $temp=~s{\s+}{##}g; 
    $info=~s{/\*\s*(.*?)\s*\*/}{$temp}; 
} 
my @personal = split(/ /, $info); 
foreach(@personal) 
{ 
    s{##}{ }g; 
    print "$_\n"; 
} 

輸出:

 
C:>perl a.pl 
Caine 
Michael 
Actor 
info data

+0

@codadict,非常感謝您的詳細回覆。我發現這是我的案子的解決方案。這是魔法。 – 2010-01-11 09:43:55

2

這真的是更好地使用正則表達式是:

$info = "Caine Michael Actor /* info data */"; 
$info =~ /(\w+)\s+(\w+)\s+(\w+).*\/\*(.+)\*\//; 
@personal = ($1, $2, $3, $4); 

主要是因爲你的輸入字符串具有與單詞分隔含糊不容易被split處理。

如果你想知道如何閱讀正則表達式:

/ 
    (\w+) # CAPTURE a sequence of one of more word characters into $1 
    \s+  # MATCH one or more white space 
    (\w+) # CAPTURE a sequence of one of more word characters into $2 
    \s+  # MATCH one or more white space 
    (\w+) # CAPTURE a sequence of one of more word characters into $3 
    .*  # MATCH zero or more of anything 
    \/\* # MATCH the opening of C-like comment /* 
    (.+) # CAPTURE a sequence of one or more of anything into $4 
    \*\/ # MATCH the closing of C-like comment */ 
/x 
+0

使用不同的分隔符避免傾斜的牙籤綜合徵,並將匹配分配給「@個人」。不要忘記檢查「@個人」是否被填充。 'if(@personal =〜m!...!)'。你也應該固定模式。 – 2010-01-11 10:26:50

+1

你真的不想匹配\ w +那裏。只要不是空白字符(即,你不關心它們是否是Perl標識符字符),你不關心字符是什麼,所以你應該匹配\ S + – 2010-01-11 10:59:40

+0

更好的是if(@personal = $ info =〜/.../){...}'。 **不要使用'$ 1'和朋友無條件!** – 2010-01-11 14:17:18

4

替代做法:

你有沒有考慮採用分體式的三參數版本:

$info = "Caine Michael Actor /* info data */"; 
@personal= split(' ',$info,4); 

導致在

@personal=('Caine','Michael','Actor','/* info data */'); 

那麼你就必須刪除/ ** / ..讓你的結果...

+1

嘆氣,我不能得到斜槓星號和星號斜線顯示.. – lexu 2010-01-11 08:14:29

+0

嗨Lexu,感謝您的回覆。我從來沒有考慮過使用3參數版本的拆分。你教我更多關於split()的知識。 – 2010-01-11 09:53:17

1

,因爲沒有一個答案了,處理一般情況下,這裏有雲:

split是不是你最好的在這裏下注,由於分隔符既可以是匹配字符也可以是非匹配字符,因此將問題反轉並描述您所做的匹配內容(在本例中爲非空格字符串)或內容交流風格的評論。

use strict; 
use warnings; 

my $info = "Caine Michael Actor /* info data */"; 
my @personal = grep {defined} $info =~ m! /\* \s* (.+?) \s* \*/ | (\S+) !xg; 

say join ', ' => @personal; 

這將返回任何您需要的序列的評論的單詞/內容的列表。語法突出顯示器不正確地突出顯示上述正則表達式,正則表達式是!