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 に答える