代码之家  ›  专栏  ›  技术社区  ›  René Nyffenegger

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

  •  3
  • René Nyffenegger  · 技术社区  · 15 年前

    在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 回复  |  直到 15 年前
        1
  •  6
  •   Eugene Yarmash    15 年前

    不知道这是否是一个优雅的解决方案,您可以使用 /g 修饰语:

    my @pairs = $str =~ /(\w+\s+\d+)/g;
    
        2
  •  15
  •   brian d foy    15 年前

    为什么把它们分成两对?你只要列一张单子,然后两个一个地记下来。

     my @words = split /\s+/, $str;
     while( @words ) {
         my( $first, $second ) = splice @words, 0, 2;
         ...;
         }
    

    如果你想要一个散列,就更简单了:

     my %pairs = split /\s+/, $str;
    

    我发现这比regex更容易理解并传递给另一个程序员。