说我有一句话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;
但它看起来不太好。分裂的任何其他简单的东西?
答案 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)
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