3

我有一个这样的字符串:

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;

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

4

3 回答 3

15

如果您使用带有捕获括号的正则表达式进行拆分,则拆分模式将包含在结果列表中(请参阅perldoc -f split):

my @list = split /(\s+)/, 'a  b   c       d';
print Data::Dumper::Dumper(\@list);

VAR1 = [
          'a',
          '  ',
          'b',
          '   ',
          'c',
          '       ',
          'd'
        ];
于 2009-12-14T07:47:50.413 回答
4

只是在单词边界上拆分:

split /\b/, $line;

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

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

编辑:正如 brian d foy 指出的那样,\b使用了错误的字符类,按照我最初的想法,我想出了使用环视断言。不过,这看起来比 Ether 的答案要复杂得多:

split /(?:(?<=\S)(?=\s)|(?<=\s)(?=\S))/, $line;
于 2009-12-14T07:41:30.383 回答
3

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

更新 - 原始 uc() 只是“更复杂功能”的简写。

好吧,通常您还可以:

$line =~ s/(\S+)/more_complex_function($1)/ge;
于 2009-12-14T07:50:16.697 回答