### Re^6: regular expessions question: (replacing words)

by \$new_guy (Acolyte)
 on Sep 28, 2010 at 07:28 UTC ( #862363=note: print w/replies, xml ) Need Help??

Hi Jethro,

Thanks for the explanation!

Yes the data fits in memory! And yes it would be appropriate to say every z is 1 and non-z is 0.

I still don't understand! How do I select two columns at random, then count only the z's that are common to all rows in the two columns. By count I meant if a z occurs in column 1 at row 6 and column 2 at row six then my count of z's would be 1. Notice my count will increase as I go down comparing the rows.

Thanks
• Comment on Re^6: regular expessions question: (replacing words)

Replies are listed 'Best First'.
Re^7: regular expessions question: (replacing words)
by jethro (Monsignor) on Sep 28, 2010 at 22:44 UTC

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

Create A New User
Node Status?
node history
Node Type: note [id://862363]
help
Chatterbox?
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others imbibing at the Monastery: (6)
As of 2017-11-23 18:39 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
In order to be able to say "I know Perl", you must have:

Results (337 votes). Check out past polls.

Notices?