in reply to Re^3: Tallying appearance of a unique string from hash keys
in thread Tallying appearance of a unique string from hash keys

Hello, I've discovered that my random hashes based on my above code are not actually random, but are biased based on the original network. What I should do is outlined in my pseudocode, some elements of which I am having trouble with:
#read IDs into %edges using match operator /(\S*)(\t)(\S*)/ and specia +l variables $1, $3 for each ID per line #assign IDs as format $edge{ID1,ID2} #skip edge assignment if ID2,ID1 already exists .. the network needs t +o be undirected such that ID2-ID1 is equivalent to ID1-ID2 and should + therefore not be counted twice #populate hash of unique IDs from %edges #create array of unique IDs from hash of unique IDs .... @uniqIDs, $un +iqIDs[0]=ID1, uniqIDs[1]=ID2 etc .. how do i do this? #initialize degree counter hash (IDs are keys, values are degrees) usi +ng @uniqIDs with foreach #go through %edges and increment %counter for each ID #generate random network with rand(int(scalar(@uniqIDs))), discard ran +dom picks if they already exist or represent undirected equivalent #initialize random network degree counter hash, and then count random +network degrees as before
I'm already stuck at how to skip an edge assignment if $2,$1 exists. Then, how can I populate a new hash of unique IDs? Again, the problem of excluding something if it already exists.
my $filename = "edges.txt"; #Set a variable for our file name open(my $fh, "<", $filename) or die "Can't open file $filename."; #Op +en the file edges.txt while (<$fh>) { if ($_ =~ m/(\S+)\t(\S+)/) { #Match the IDs in the fil +e to $1 and $2 $edge{$1,$2}= $holder; #assign IDs as format $edge +{ID1,ID2} close $fh; #Close the file edges.txt my @list = keys %uniqedge; print "@list\n"; #Prints the list of keys, but they are un +i-directional (i.e. repeated for ID1-ID2 and ID2-ID1)
Once I have these steps, I can proceed to counting and using the unique IDs list to create my random networks.

Replies are listed 'Best First'.
Re^5: Tallying appearance of a unique string from hash keys
by ig (Vicar) on Mar 28, 2009 at 20:45 UTC

    You might find module Graph helpful for some of what you are doing.

    Some of your questions/difficulties relate to quite basic aspects of Perl and data structures. This is not surprising given you say you are a "newbie". As in the addage "you must learn to walk before you can run", it may be quicker for you to put aside your bigger problem briefly and focus on the basics. A good place to start for Perl, with links to many resources is: Where and how to start learning Perl. Otherwise, you might make sure you are familiar with data structures, graphs, algorithms in general, statistics and sets. Once you know all this (and I am not trying to suggest you currently know none of it) you will be able to solve your bigger problem much more easily and more quickly.

    In particular, it seems you need to review: perldata, perlreftut, perlref, perldsc and perllol. These will help you better understand several of your problems and make you aware of alternative solutions for them.

    update:

    Again, the problem of excluding something if it already exists.

    A common technique for finding/avoiding duplicates is to use a hash to store what you already have and then do lookup.

    #!/usr/bin/perl # use strict; use warnings; my @list_of_items = qw(a b c a d b b z f); my %seen; foreach my $item (@list_of_items) { if($seen{$item}++) { # do what is appropriate for items that have already been seen print "saw an $item again\n"; } else { # do what is appropriate for items that have not already been +seen print "saw an $item\n"; } } foreach my $item (sort keys %seen) { print "$item is in \@list_of_items $seen{$item} " . (($seen{$item} + > 1)?"times\n":"time\n"); }