我有一个这样的字符串:
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;
我想重新加入原始空格的字符串。有什么方法可以存储分割的空白并在以后重新使用它?或者这会是一个巨大的痛苦?它主要是装饰性的,但我想保留输入字符串中的原始空格。
答案 0 :(得分:15)
如果使用带有捕获括号的正则表达式进行拆分,则拆分模式将包含在结果列表中(请参阅perldoc -f split):
my @list = split /(\s+)/, 'a b c d';
print Data::Dumper::Dumper(\@list);
VAR1 = [
'a',
' ',
'b',
' ',
'c',
' ',
'd'
];
答案 1 :(得分:4)
只是拆分字边界:
split /\b/, $line;
对于您的示例,这将给出:
('a',' ','b',' ','c',' ','d')
编辑:正如brian d foy指出的那样,\b
使用了错误的字符类,按照我最初的想法,我想出了使用环视断言。这看起来比以太的答案更复杂:
split /(?:(?<=\S)(?=\s)|(?<=\s)(?=\S))/, $line;
答案 2 :(得分:3)
为什么不这样做:my $new_str = uc( $line );
?
UPDATE - 原始的uc()只是“更复杂的功能”的简写。
嗯,通常你也可以:
$line =~ s/(\S+)/more_complex_function($1)/ge;