0

私はラインを持っているとしましょうlead=george wife=jane "his boy"=elroy。スペースで分割したいのですが、「彼の男の子」の部分が含まれていません。私は一人と見なされるべきです。

通常の分割では、「彼」を 1 つ、「少年」を 2 番目の部分として、「彼の少年」を分割しています。これを回避する方法

これに続いて、私は試しました

split " ", $_

これが機能することを知りました

use strict; use warnings;

my $string = q(hi my name is 'john doe');
my @parts = $string =~ /'.*?'|\S+/g;
print map { "$_\n" } @parts;

しかし、それはよく見えません。分割自体を使用した他の簡単なことはありますか?

4

4 に答える 4

5

これにはText::ParseWordsを使用できます

 use Text::ParseWords;

$list = "lead=george wife=jane \"his boy\"=elroy";

@words = quotewords('\s+', 0, $list);
  $i = 0;
  foreach (@words) {
      print "$i: <$_>\n";
      $i++;
  }

出力:

0: <lead=george>
1: <wife=jane>
2: <his boy=elroy>
于 2013-08-13T13:08:28.050 に答える
2

sub split_space {
  my ( $text ) = @_;

  while (
    $text =~ m/
      (               # group ($1)
        \"([^\"]+)\"  # first try find something in quotes ($2)
        |
        (\S+?)        # else minimal non-whitespace run ($3)
      )
      =
      (\S+)           # then maximum non-whitespace run ($4)
    /xg
  ) {
    my $key = defined($2) ? $2 : $3;
    my $value = $4;

    print( "key=$key; value=$value\n" );
  }
}

split_space( 'lead=george wife=jane "his boy"=elroy' );

出力:

key=lead; value=george
key=wife; value=jane
key=his boy; value=elroy
于 2013-08-13T13:07:09.570 に答える