Bill Stephenson wrote:
> Hi all,
>
> I need some help. I have name/value parameters coming in from a web
> form that look something like this (blank lines added for clarity):
>
> firstname=bill
> lastname=stephenson
>
> q1=1
> t1=y
> d1=something 1
> p1=3.45
>
> q2=
> t2=y
> d2=something 2
> p2=1.90
>
> q3=
> t3=y
> d3=
> p3=
>
> q4=1
> t4=y
> d4=something 3
> p4=12
>
> q5=
> t5=y
> d5=
> p5=
>
> q6=3
> t6=y
> d6=something 4
> p6=1.22
>
> id_number=10000259
> action=none
>
> I want to remove the groups of data that look like "q3-p3" and "q5-p5"
> (where "q","d", and "p" are all empty, "t" will always have data) then
> re-number the groups that contain data in in at least one of the
> "q","d", or "p" variables, then save them to a file that looks
> something like this:
>
> firstname=bill
> lastname=stephenson
>
> q1=1
> t1=y
> d1=something 1
> p1=3.45
>
> q2=
> t2=y
> d2=something 2
> p2=1.90
>
> q3=1
> t3=y
> d3=something 3
> p3=12
>
> q4=3
> t4=y
> d4=something 4
> p4=1.22
>
> id_number=10000259
> action=none
>
> I'm having trouble with the logic that will accomplish this. It
> doesn't seem like it should be very hard to do, but I just can't seem
> to say it in "perl".
[snip code]
Here's the approach I would take (not tested!)
my %data;
for (param()) { # loop through all parameters
if (/^([qtdp])(\d+)$/) {
my $prefix = $1;
my $num = $2;
$data{$num}{prefix} = param($_);
}
}
Basically, this inverts the data so you have a hash like:
(
'1' => { q => 1, t => 1, d => 'something 1', p => 3.45 },
'2' => { q => '', t => 2, d => 'something 2', p => 1.90 },
... and so on
}
Now, let's find the groups that have something in q, d, or p:
my @groups = grep "@data{$_}{qw/q d p/}" =~ /\S/, sort { $a <=> $b } keys
%data;
Now you can write those groups out, renumbering as you go:
my $n = 0;
for my $g (@groups) {
$n++;
print "$_$n $g->{$_}\n" for qw/q t d p/;
}
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>