Greg,

You might consider using the Perl split command and store the results in a list:

@list = split /\</,$line;

Dirk Bremer - Systems Programmer II - AMS Department - NISC
636-922-9158 ext. 652 fax 636-447-4471

<mailto:[EMAIL PROTECTED]>

----- Original Message -----
From: "Greg Wardawy" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Tuesday, February 27, 2001 12:06 PM
Subject: Repeated pattern matching


Hello all,

To extract data from the following text:

PO1<<150<EA<7.44<<UP<091857282152<VA<PENPEARLEAR
CTP<<RES<9<150<EA
PO4<1<1<EA
SDQ<EA<92<674<2<666<2<663<2<651<2<640<2<637<2<634<2<632<2<630<2<629<2
SDQ<EA<92<621<2<620<2<618<2<610<2<606<2<602<2<598<2<596<2<590<2<588<2
SDQ<EA<92<587<2<586<2<580<2<579<2<578<2<575<2<573<2<566<2<565<2<561<2
SDQ<EA<92<554<2<551<2<545<2<539<2<530<2<529<2<528<2<521<2<517<2<514<2
SDQ<EA<92<506<2<498<2<497<2<496<2<490<2<478<2<472<2<470<2<461<2<459<2
SDQ<EA<92<458<2<450<2<443<2<425<2<420<2<405<2<402<2<398<2<393<2<389<2
SDQ<EA<92<388<2<387<2<384<2<378<2<376<2<358<2<354<2<351<2<346<2<342<2
SDQ<EA<92<338<2<328<2<325<2<206<2<129<2

I'm using the following code:

####cut####
} elsif ($line =~ m/^PO1<<\d+<EA<(.+)<<UP<(\d{12})<?V?A?<?(\w+)?.+/) {
$upc = $2;
$desc = $3;
} elsif ($line =~ m/(^CTP<<RES<)(.+)<\d+<EA.+\n/) {
$price = $2;
} elsif ($line =~
m/^SDQ<EA<92<(\d+)<(\d+)<?(\d+)?<?(\d+)?<?(\d+)?<?(\d+)?<?(\d+)?<?(\d+)?<?(\d+)?<?(\d+)?<?(\d+)?<?(\d+)?<?(\d+)?<?(\d+)?<?(\d+)?<?(\
d+)?<?(\d+)?<?(\d+)?<?(\d+)?<?(\d+)?.+/) {

$sdq3 = $1, $sdq13 = $11;      # $sdq + odd number - store number,  $sdq + even number 
- quantity
$sdq4 = $2, $sdq14 = $12;
$sdq5 = $3, $sdq15 = $13;
$sdq6 = $4, $sdq16 = $14;
$sdq7 = $5, $sdq17 = $15;
$sdq8 = $6, $sdq18 = $16;
$sdq9 = $7, $sdq19 = $17;
$sdq10 = $8,                 $sdq20 = $18;
$sdq11 = $9,                 $sdq21 = $19;
$sdq12 = $10,                 $sdq22 = $20;
select (CUSTORD1);
$sdq4 = 3 if $2 > 3 and $limit{$desc};
$sdq6 = 3 if $4 > 3 and $limit{$desc}; # it limits qty for the items in limit.csv
$sdq8 = 3 if $6 > 3 and $limit{$desc};
$sdq10 = 3 if $8 > 3 and $limit{$desc};
$sdq12 = 3 if $10 > 3 and $limit{$desc};
$sdq14 = 3 if $12 > 3 and $limit{$desc};
$sdq16 = 3 if $14 > 3 and $limit{$desc};
$sdq18 = 3 if $16 > 3 and $limit{$desc};
$sdq20 = 3 if $18 > 3 and $limit{$desc};
$sdq22 = 3 if $20 > 3 and $limit{$desc};

warn "UPC number $upc doesn't exist in the Elite database!!!!!\n" if 
length($upc_itemlist{$upc}) == 0;
sleep  if length($upc_itemlist{$upc}) == 0;

print "$sdq3,$upc,$price,$sdq4\n" if $sdq3 > 0;            # if - don't print a line 
if there is no data
print "$sdq5,$upc,$price,$sdq6\n" if $sdq5 > 0;
print "$sdq7,$upc,$price,$sdq8\n" if $sdq7 > 0;
print "$sdq9,$upc,$price,$sdq10\n" if $sdq9 > 0;
print "$sdq11,$upc,$price,$sdq12\n" if $sdq11 > 0;
print "$sdq13,$upc,$price,$sdq14\n" if $sdq13 > 0;
print "$sdq15,$upc,$price,$sdq16\n" if $sdq15 > 0;
print "$sdq17,$upc,$price,$sdq18\n" if $sdq17 > 0;
print "$sdq19,$upc,$price,$sdq20\n" if $sdq19 > 0;
print "$sdq21,$upc,$price,$sdq22\n" if $sdq21 > 0;

}
################

The SDQ line can have up to 10 pairs store/quantity ($sdq+odd number/$sdq+even number) 
and, as you can see, my pattern matching is
really ugly - any solutions
are greatly appreciated. I think this is a good way to learn a good style of 
programming - do something yourself, even if it's ugly,
then ask gurus how it should be in proper programming style. And the next question: 
how can I avoid repetition of the print
statement above?
TIA

Greg.

_______________________________________________
Perl-Win32-Users mailing list
[EMAIL PROTECTED]
http://listserv.ActiveState.com/mailman/listinfo/perl-win32-users



_______________________________________________
Perl-Win32-Users mailing list
[EMAIL PROTECTED]
http://listserv.ActiveState.com/mailman/listinfo/perl-win32-users

Reply via email to