0

说我有一条线lead=george wife=jane "his boy"=elroy。我想用空格分开,但这不包括“他的男孩”部分。我应该被视为一个。

使用正常拆分它也拆分“他的男孩”,例如将“他的”作为一个,将“男孩”作为第二部分。如何逃避这个

在此之后我尝试了

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 回答
0

PP贴一个很好的解决方案。但为了确保有一种很酷的其他方法可以做到这一点,我的解决方案是:

my $string = q~lead=george wife=jane "his boy"=elroy~;

my @split = split / (?=")/,$string;
my @split2;
foreach my $sp (@split) {
  if ($sp !~ /"/) {
    push @split2, $_ foreach split / /, $sp;
  } else {
    push @split2,$sp;
  }
}
use Data::Dumper;
print Dumper @split2;

输出:

$VAR1 = 'lead=george';
$VAR2 = 'wife=jane';
$VAR3 = '"his boy"=elroy';

我在这里使用 Lookahead 来首先拆分键在引号内的部分" "。之后,我遍历整个数组并拆分所有其他部分,这是正常的key=values

于 2013-08-13T13:25:22.730 回答
0

您可以使用单个正则表达式获得所需的结果,该正则表达式提取键和值并将结果放入哈希表中。

(\w+|"[\w ]+") 将匹配键侧的单个和多个单词。正则表达式只捕获键和值,因此匹配操作的结果将是一个包含以下内容的列表:键#1、值#1、键#2、值#2等。

当匹配结果分配给它时,哈希会使用适当的键和值自动启动。

这是代码

my $str = 'lead=george wife=jane "hello boy"=bye hello=world';

my %hash = ($str =~ m/(?:(\w+|"[\w ]+")=(\w+)(?:\s|$))/g);

## outputs the hash content
foreach $key (keys %hash) {
  print "$key => $hash{$key}\n";
}

这是这个脚本的输出

lead => george
wife => jane
hello => world
"hello boy" => bye
于 2013-08-13T19:59:11.777 回答