Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
833 views
in Technique[技术] by (71.8m points)

perl - How to join lines in between 2 conditions

I'm listing a program to customly clean up a phonebook .vcf file.

I can't figure out how to place in a single string variable everything between start with /^NOTE.+:/ and end before /X-ACCOUNT.*:/. Please consider there were presence of I'd like preserve for future contact formatting:

ADR;WORK;X-SYNCMLREF507891:;;NUENSCfff STRASSE 3-5;RIESCHWEILER;;66509;Germania

ORG:aaaa & CO. KG

NOTE;ENCODING=QUOTED-PRINTABLE:Hall 30 F35=0A*ddddd@jggggine.com                   =0A014 =
 EURO                          =0A*kkkk@ggggne.com   =0A=
Bjjj@rrrLINE.COM 

X-ACCOUNT:Local Phone Account;Phone

maybe using any foreach loop. but I can't concatenate only what I need and stop at the right point:

foreach $in (<IN>){
if($in =~ /^NOTE.*:|=$/){
    unless($in =~ /^[A-Z]+:/){
        $in =~ s/(.+=$)
//;
        $inn .= $1;
    }
}

$a = $a;

}

Any recomandations ?

question from:https://stackoverflow.com/questions/65910258/how-to-join-lines-in-between-2-conditions

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

More or less this:

$inn .= $in if (($in =~ /^NOTE/ .. $in =~ /^X-ACCOUNT/) && $in !~ /^X-ACCOUNT/);

Using implicit $_ would make it shorter, perhaps:

while(<IN>) {
   $inn .= $_ if (/^NOTE/ .. /^X-ACCOUNT/ and !/^X-ACCOUNT/);

See perlop for Range Operators and perhaps also perlop for why and is lower precedence than &&.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...