2009-12-14 33 views
3

定界符我有一个​​这样的字符串:将字符串分割成令牌和存储在Perl

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; 

我想重新加入带有原始空格的字符串。有什么方法可以将分割后的空白存储起来并在以后重新使用?或者这会是一个巨大的痛苦?这主要是美容,但我想保留输入字符串的原始空间。

回答

15

如果拆分使用正则表达式与捕获括号,分割样式将被包括在结果列表中(见perldoc -f split):

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

VAR1 = [ 
      'a', 
      ' ', 
      'b', 
      ' ', 
      'c', 
      '  ', 
      'd' 
     ]; 
4

刚刚拆分单词边界:

split /\b/, $line; 

对于你的榜样,这将给:

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

编辑:正如布赖恩d FOY指出,\b使用错误的字符类,遵循我原来的想法,我想出了使用环视声明。这看起来的方式要复杂得多醚的回答,虽然:

split /(?:(?<=\S)(?=\s)|(?<=\s)(?=\S))/, $line; 
+1

这可能会意外地劈在那都不算事的空白边界。 –

+0

感谢您指出这一点!我没有考虑'\ w'与'\ s'的关系,而是写了原始答案。相应地编辑我的答案。 – hillu

3

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

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

好,一般你还可以:

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

因为我的真实情况更复杂,而这仅仅是一个例子。 –