Tao Wang wrote: > thanks a lot. But there is one problem - this is my > fault. The KEY1, KEY2 don't exactly look like this. > There are six KEYS. Three are related to KEYS, but the > rest of them are A_BEG A_END, B_OPTIONS, and I need to > extract information between them. I used one variable > $op=KEY1|KEY2|KEY3|A_BEG|A_END|B_OPTIONS to store all > the alternatives, and tried to use > > my @values = $line =~ /$op.*$op/g; > > But didn't work as i expected. Are there any > problems. please help me with it. thanks again.
Hi Tao. Your solution is a good one, but the problem is the resulting regex: /$op.*$op/ is /KEY1|KEY2|KEY3|A_BEG|A_END|B_OPTIONS.*KEY1|KEY2|KEY3|A_BEG|A_END|B_OPTIONS/ which will match any of the strings between the pipes: A_BEG A_END B_OPTIONS B_OPTIONS.*KEY1 KEY1 KEY2 or KEY3 which isn't quite what you had in mind! You could make it work with some parentheses, but I think it's cleaner using John's 'split' method. Here's another program which builds the regex for you and processes your original data. The 'undef' on the left of the assignement serves to discard the blank initial field before the first key. Note also that all the spaces are still in the data. It's easy enough to get rid of them, but without knowing what you want to do with them after this stage I thought it best to leave things as they are. HTH, Rob #!perl use strict; use warnings; my $keys = join '|', qw ( KEY1 KEY2 KEY3 A_BEG A_END B_OPTIONS ); while (<DATA>) { chomp; my (undef, @data) = split $keys; print ">$_<\n" foreach @data; print "\n"; } __DATA__ KEY1 3 4 T KEY2 KEY1 3 4 T KEY2 456 67 KEY3 KEY1 3 4 T KEY2 456 67 KEY3 output: > 3 4 T < > 3 4 T < > 456 67 < > 3 4 T < > 456 67 < -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]