我有:
my $string = aaaa bbbb "ccccc ddddd eeee" fffff "ggggg hhhh";
我希望将此字符串拆分为:
aaaa
bbbb
cccc dddd eeee
ffff
gggg hhhh
我如何使用拆分来做到这一点?
我认为它应该看起来像这样的伪代码:
split(/IF ONWARD SYMBOL " APPEARS EVENT COUNT DO PATTERN: \s ELSE: "/ $string);
注意:需要保留字符串中的字符顺序
答案 0 :(得分:4)
您可以使用Perl核心库中的便捷模块Text::ParseWords
来执行此操作:
use strict;
use warnings;
use Data::Dumper;
use Text::ParseWords;
my $string = qq(aaaa bbbb "ccccc ddddd eeee" fffff "ggggg hhhh");
my @parts = quotewords('\s+', 0, $string);
print Dumper \@parts;
<强>输出:强>
$VAR1 = [
'aaaa',
'bbbb',
'ccccc ddddd eeee',
'fffff',
'ggggg hhhh'
];
答案 1 :(得分:1)
最好使用全局正则表达式将字符串分为引用和非引用部分。
不是使用split
。
use strict;
use warnings;
my $string = 'aaaa bbbb "ccccc ddddd eeee" fffff "ggggg hhhh"';
my @split = $string =~ / " [^"]* " | \S+ /xg;
print "$_\n" for @split;
<强>输出强>
aaaa
bbbb
"ccccc ddddd eeee"
fffff
"ggggg hhhh"
答案 2 :(得分:0)
您可以分别匹配单词内部和双面引号,并在循环中使用/g
,如下所示:
#!/usr/bin/perl
use strict;
use warnings;
my $string = 'aaaa bbbb "ccccc ddddd eeee" fffff "ggggg hhhh"';
while ($string =~ m/(\w+)|"([^"]+)"/g) {
print $1 || $2, "\n";
}
运行:
$ perl t.pl
aaaa
bbbb
ccccc ddddd eeee
fffff
ggggg hhhh
顺便说一句,您只需一行即可实现上述目标:
@field = grep { defined } ( $string =~ m/(\w+)|"([^"]+)"/g );
答案 3 :(得分:0)
分裂的方式:
use strict;
use warnings;
my $string = '"aaaa" bbbb kkkk "ccccc ddddd eeee" fffff eeee "ggggg hhhh"';
my @res = grep {$_} split(/ *"([^"]*)" *| +/, $string);
print join($/, @res);