2009-12-08 45 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; 
相关问题