我有一句话:
$myline = 'ca,cb,cc,cd,ce';
我需要将 ca 与 $ 1 , cb 匹配到 $ 2 等等。
不幸的是
$myline =~ /(?:(\w+),?)+/;
不起作用。使用pcretest,它只会将'ce'与$ 1匹配。 怎么做对了? 我是否需要将其置于while循环中?
谢谢!
答案 0 :(得分:10)
答案 1 :(得分:9)
使用my @parts = split(/,/, $myline)
不是更容易吗?
答案 2 :(得分:3)
虽然split
是解决问题的好方法,但列表上下文中的捕获正则表达式也很有效。了解这两种方法很有用。
my $line = 'ca,cb,cc,cd,ce';
my @words = $line =~ /(\w+)/g;
答案 3 :(得分:3)
查看您可以从CPAN下载的CSV PM,即Text::CSV
或Text::CSV_XS
。
这将为您提供所需的信息,并说明恰好引用的任何逗号分隔值。
使用这些模块可以轻松地将数据拆分并通过它进行解析......
例如:
my @field = $csv->fields;
答案 4 :(得分:1)
如果元素的数量是可变的,那么你就不会按照你想要的方式去做。使用全局标志循环遍历字符串:
while($myline =~ /(\w+)\b/g) { # do something with $1 }
我猜你的真实数据比'ca,cb,cc,cd,ce'更复杂,但如果不是,则可能不保证使用正则表达式。你最好在分隔字符上拆分字符串:
my @things = split ',', $myline;