[已解决][求助]如何做如下字串切分?

[已解决][求助]如何做如下字串切分?

对“abc;efg;ddd; fdd",要切为"abc", "efg", "ddd; fdd"
即以";"切开,但遇到"; "的不切。应该如何写?

#!/usr/bin/perl

use strict;
use warnings;

$_ = 'abc;efg;ddd; fdd';

while ($_) {
        if (/^(\w+;\s+\w+)/) {
                $_ = $';
                print "$1 ";
        } elsif (/^(\w+);/){
                $_ = $';
                print "$1 ";
        }
}


____________________
如果要像split那样返回数组,有简便些的办法吗?
感觉一个个push看起来不太舒服。

我暂时是这样解决的:

[Copy to clipboard] [ - ]
CODE:
my $groups='ID=12002.t00840;Name=CSLA1 - cellulose synthase-like family A; mannan synthase, expressed';
# patch for TIGR GFF3
    $groups=~ s/; /@@@@@/g;
    $groups=~ s/, /#####/g;

    my @groups = split(/\s*;\s*/, $groups);

    for my $group (@groups) {
        my ($tag,$value) = split /=/,$group;
        $tag             = unescape($tag);
        my @values       = map {unescape($_)} split /,/,$value;
        for my $v ( @values ) {
            $v=~s/@@@@@/; /g;   # patch for TIGR GFF3
            $v=~s/#####/, /g;   # patch for TIGR GFF3
            $feat->add_tag_value($tag,$v);
            }
    }

There Is More Than One Way To Do It   


QUOTE:
原帖由 galaxy001 于 2008-6-29 16:22 发表
如果要像split那样返回数组,有简便些的办法吗?

有的,就用 split, 不过你得仔细研究下 regexp
用零宽度向前断言就可以了。


QUOTE:
原帖由 flw 于 2008-6-29 19:45 发表
用零宽度向前断言就可以了。

还没有看 大骆驼 的 正则式 部分,版主能不能给个例子啊。


QUOTE:
原帖由 cobrawgl 于 2008-6-29 21:11 发表

还没有看 大骆驼 的 正则式 部分,版主能不能给个例子啊。



[Copy to clipboard] [ - ]
CODE:
D:\MoChou>perl -ne "print if 1../__END__/" ttt.pl
my $str = "abc;efg;ddd; fdd";
my @list = split /;(?=\S)/, $str;
print "[$_]\n" foreach @list;
__END__

D:\MoChou>ttt
[abc]
[efg]
[ddd; fdd]

D:\MoChou>



thanks  


QUOTE:
原帖由 flw 于 2008-6-29 21:33 发表

D:\MoChou>perl -ne "print if 1../__END__/" ttt.pl
my $str = "abc;efg;ddd; fdd";
my @list = split /;(?=\S)/, $str;
print "[$_]\n" foreach @list;
__END__

D:\MoChou>ttt
[abc]
[efg]
[ddd; ...

让老大给抢先了  为了鼓励自己,我还是要把我的CODE贴出来,也算写个笔记,已备自己日后查阅!
while(<DATA>){
my @list = split /\;(?=\w)/;
print join ",",@list;
}


__END__
abc;efg;ddd; fdd


QUOTE:
D:\>perl -w tem.txt
abc,efg,ddd; fdd

-----------其实2周前我也不知道有“环视”一说,是看了FLW老大前些天的回帖(详见:如何提取介于某个区间的几行文字,区间的开始和结束可以用正则表达式描述)才去学习?!的用法,无心插柳柳成荫,把?<=和?=也顺带看了,呵呵,真好!      希望坛子里的神仙们多多回帖,不懂的地方我们就多多查阅资料,直到弄明白,很好很强大