如何在Perl中优雅地从字符串中分割成对的单词?

时间:2010-02-26 09:30:37

标签: perl

在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;

但我想知道这个问题是否有更优雅的解决方案。

2 个答案:

答案 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;