在perl中,我有一个大致看起来像
的字符串my $str = "one 10 two 20 three 30";
现在,我想将该字符串拆分为字数对,但是 没有成功。
我以为我可以做一个
my @pairs = split /([a-z]+[^a-z]+)/, $str;
然后会有
$pairs[0] eq 'one 10 '
$pairs[1] eq 'two 20 '
$pairs[2] eq 'three 30'
然而,我得到了
$pairs[0] eq ' '
$pairs[1] eq 'one 10 '
$pairs[2] eq ' '
$pairs[3] eq 'two 20 '
$pairs[4] eq ' '
$pairs[5] eq 'three 30'
现在,我可以使用grep来获得我想要的结果:
my @pairs = grep {$_ =~ /\S/} split /([a-z]+[^a-z]+)/, $str;
但我想知道这个问题是否有更优雅的解决方案。
答案 0 :(得分:15)
为什么要将它们分成两对?只需获取一个单词列表,然后将它们分成两部分。
my @words = split /\s+/, $str;
while( @words ) {
my( $first, $second ) = splice @words, 0, 2;
...;
}
如果你想要一个哈希,它甚至更简单:
my %pairs = split /\s+/, $str;
我发现更容易理解并传递给另一个程序员而不是正则表达式。
答案 1 :(得分:6)
不知道它是否是一个优雅的解决方案,您可以使用/g
修饰符匹配:
my @pairs = $str =~ /(\w+\s+\d+)/g;