2009-12-08 42 views
2

我有一句臺詞:如何從Perl中的逗號分隔字符串中提取單詞?

$myline = 'ca,cb,cc,cd,ce'; 

我需要匹配CA$ 1CB$ 2等。

不幸的是

$myline =~ /(?:(\w+),?)+/; 

沒有按沒有工作。使用pcretest時,只能將'ce'轉換爲$ 1。 如何做到這一點? 我是否需要將它放入while循環?

謝謝!

+0

如果可以的話包含逗號,您可以使用CSV模塊,如http://search.cpan.org/~makamaka/Text-CSV-1.16/lib/Text/CSV.pm – 2009-12-09 12:23:05

回答

10

爲什麼不使用split function

@parts = split(/,/,$myline); 

split將字符串分割成使用您提供作爲分隔符正則表達式的字符串列表。

9

使用方便嗎my @parts = split(/,/, $myline)

+0

沒錯!最簡單的方法是使用分割! – 2009-12-08 09:41:20

1

如果元素的數量是可變的,那麼你就不會按照你想要的方式去做。

while($myline =~ /(\w+)\b/g) { 
    # do something with $1 
}

我會猜,你的真實數據比「CA,CB,CC,CD,CE」更復雜,但是如果它不是那麼使用:使用全局標誌,通過串迴路正則表達式可能不合理。你會更好的分隔字符分割字符串:

my @things = split ',', $myline;
+0

你說得對。在我的情況下使用split更好。我爲什麼不想到它? – 2009-12-08 09:40:22

+0

因爲它是Perl,有很多方法可以做到這一點。 – 2009-12-08 10:48:15

3

雖然split是來解決問題的好辦法,在列表上下文中的捕獲正則表達式也是行之有效的。瞭解這兩種方法是有用的。

my $line = 'ca,cb,cc,cd,ce'; 
my @words = $line =~ /(\w+)/g; 
+1

一個顯着的區別是split會保留空的條目,在逗號相鄰的位置給出'undef'。正則表達式方法會忽略這些地方,因爲它們不包含一個或多個單詞字符。 – 2009-12-08 14:57:25

3

查找到CSV PM的你可以從CPAN下載,即Text::CSVText::CSV_XS

這將爲您提供您所需的信息,並解釋發生引用的逗號分隔值。

使用這些模塊可以很容易地將數據拆分出來,並通過它解析...

例如:

my @field = $csv->fields; 
相關問題