代码之家  ›  专栏  ›  技术社区  ›  James Thompson

将字符串拆分为标记并将分隔符存储在Perl中

  •  3
  • James Thompson  · 技术社区  · 15 年前

    我有一根这样的绳子:

    a  b   c       d
    

    我处理字符串的方式如下:

       chomp $line;
        my @tokens = split /\s+/, $line;
        my @new_tokens;
        foreach my $token (@tokens) {    
            push @new_tokens, some_complex_function( $token );
        }
        my $new_str = join ' ', @tokens;
    

    我想用原始空白重新连接字符串。有什么方法可以存储split中的空白并在以后重新使用它吗?或者这将是一个巨大的痛苦?它主要是修饰性的,但我想保留输入字符串中的原始空格。

    3 回复  |  直到 15 年前
        1
  •  15
  •   Ether    15 年前

    如果使用带有捕获括号的regex进行拆分,拆分模式将包含在结果列表中(请参见 perldoc -f split )以下内容:

    my @list = split /(\s+)/, 'a  b   c       d';
    print Data::Dumper::Dumper(\@list);
    
    VAR1 = [
              'a',
              '  ',
              'b',
              '   ',
              'c',
              '       ',
              'd'
            ];
    
        2
  •  4
  •   hillu    15 年前

    只是在单词边界上拆分:

    split /\b/, $line;
    

    对于您的示例,这将给出:

    ('a','  ','b','   ','c','       ','d')
    

    编辑: 正如布赖恩·福伊指出的那样, \b 使用了错误的字符类,按照我最初的想法,我想出了使用环顾断言的方法。不过,这看起来比乙醚的答案要复杂得多:

    split /(?:(?<=\S)(?=\s)|(?<=\s)(?=\S))/, $line;
    
        3
  •  3
  •   user80168    15 年前

    为什么你不简单地做: my $new_str = uc( $line ); ?

    update-original uc()只是“更复杂的函数”的简写。

    一般来说,你也可以:

    $line =~ s/(\S+)/more_complex_function($1)/ge;