如何跳过分割线的某些部分

时间:2013-08-13 13:02:33

标签: perl

说我有一句话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 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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

答案 2 :(得分: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

答案 3 :(得分: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