That with the 0 and 1 would only have been necessary if you needed to compress the data , i.e. save memory. Which you say isn't the case.
Ok, here is the subroutine that counts rows with all 'z' in specific columns:
sub countrows {
# First parameter is a pointer/reference to the data
# Second parameter is an array of columns numbers
my ($data,@f)= @_;
my $count=0;
foreach my $row (@$data) {
my $success=1;
foreach (@f) {
if ($row->[$_] ne 'z') {
$success=0;
last;
}
}
$count+= $success;
}
return $count;
}
my @data= ( ['z',4,'z',4,'z'],['z',4,'z',4,4],['z','z','z',4,'z'] );
print countrows(\@data,0,2),' ',countrows(\@data,1,3,2),' ',countrows(
+\@data,4),"\n";
# print 3 0 2
Now to get an array of random numbers. To make sure I don't get numbers twice I generate an array of all numbers up to the number of columns and pick (i.e. extract and delete) random numbers from that array
sub randomarray {
my ($columns,$count)= @_;
my @all;
push @all, $_ foreach (0..($columns-1));
my @randarray;
while ($count-- >0) {
push @randarray, splice(@all, int(rand(@all)),1);
}
return @randarray;
}
print join ' ',randomarray( scalar @{$data[0]} , 2 ),"\n";
print join ' ',randomarray( scalar @{$data[0]} , 3 ),"\n";
print join ' ',randomarray( scalar @{$data[0]} , 4 ),"\n";
# might print
3 4
3 0 1
0 1 4 2
You see how I cut the problem into smaller pieces that are easier to tackle? Ok, the subroutines are still not trivial. But you should be able to connect them in a sensible way to solve your problem
|