我有一句台词:如何从Perl中的逗号分隔字符串中提取单词?
$myline = 'ca,cb,cc,cd,ce';
我需要匹配CA到$ 1,CB到$ 2等。
不幸的是
$myline =~ /(?:(\w+),?)+/;
没有按没有工作。使用pcretest时,只能将'ce'转换为$ 1。 如何做到这一点? 我是否需要将它放入while循环?
谢谢!
我有一句台词:如何从Perl中的逗号分隔字符串中提取单词?
$myline = 'ca,cb,cc,cd,ce';
我需要匹配CA到$ 1,CB到$ 2等。
不幸的是
$myline =~ /(?:(\w+),?)+/;
没有按没有工作。使用pcretest时,只能将'ce'转换为$ 1。 如何做到这一点? 我是否需要将它放入while循环?
谢谢!
使用方便吗my @parts = split(/,/, $myline)
?
没错!最简单的方法是使用分割! – 2009-12-08 09:41:20
如果元素的数量是可变的,那么你就不会按照你想要的方式去做。
while($myline =~ /(\w+)\b/g) { # do something with $1 }
我会猜,你的真实数据比“CA,CB,CC,CD,CE”更复杂,但是如果它不是那么使用:使用全局标志,通过串回路正则表达式可能不合理。你会更好的分隔字符分割字符串:
my @things = split ',', $myline;
你说得对。在我的情况下使用split更好。我为什么不想到它? – 2009-12-08 09:40:22
因为它是Perl,有很多方法可以做到这一点。 – 2009-12-08 10:48:15
虽然split
是来解决问题的好办法,在列表上下文中的捕获正则表达式也是行之有效的。了解这两种方法是有用的。
my $line = 'ca,cb,cc,cd,ce';
my @words = $line =~ /(\w+)/g;
一个显着的区别是split会保留空的条目,在逗号相邻的位置给出'undef'。正则表达式方法会忽略这些地方,因为它们不包含一个或多个单词字符。 – 2009-12-08 14:57:25
查找到CSV PM的你可以从CPAN下载,即Text::CSV
或Text::CSV_XS
。
这将为您提供您所需的信息,并解释发生引用的逗号分隔值。
使用这些模块可以很容易地将数据拆分出来,并通过它解析...
例如:
my @field = $csv->fields;
如果可以的话包含逗号,您可以使用CSV模块,如http://search.cpan.org/~makamaka/Text-CSV-1.16/lib/Text/CSV.pm – 2009-12-09 12:23:05