Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw

split function

by herny (Initiate)
on Jul 12, 2010 at 16:09 UTC ( #849033=perlquestion: print w/replies, xml ) Need Help??
herny has asked for the wisdom of the Perl Monks concerning the following question:

I guess it is working now, but I might have another problem in my script, as I am not getting the expected result. My whole code is:
#!/usr/bin/perl + #network_coco.plx + use warnings; use strict; + open(DATAIN, "<$ARGV[0]")||die"cannot open \"ARGV[0]\":$!"; open(DATAOUT2, ">>cococount.txt")||die"$!\n"; + for(my $count=0.9; $count<=0.95; $count=$count+0.01) { open(DATAOUT, ">variable")||die"$!\n"; while(<DATAIN>) { my @line=split (/\t/); if($line[2] >= $count) { print DATAOUT; } } close(DATAOUT); system ("clm close -abc variable --is-undirected --write-count -cc +-bound 5 > var2"); #clm close reads file variable, and gives back an integer + open(VAR2, "<var2")||die"$!\n"; while (<VAR2>) { chomp; print DATAOUT2 "$count\t$_\n"; } close(VAR2); } + close(DATAOUT2); +
What I want is a the file cococount.txt containing:
0.9 (tab) 13 0.91 (tab) 9 0.92 (tab) 7 0.93 (tab) 8 0.94 (tab) 5 0.95 (tab) 4 And what I get is: 0.9 (tab) 13 0.91 (tab) 0 0.92 (tab) 0 0.93 (tab) 0 0.94 (tab) 0
I guess the problem should be overwritting file "variable". Also, I do not get the final line : 0.95 ... Any ideas? Many thanks, Hernando

Replies are listed 'Best First'.
Re: split function
by jwkrahn (Monsignor) on Jul 12, 2010 at 18:39 UTC

    Perhaps your code will run better like this:

    #!/usr/bin/perl #network_coco.plx use warnings; use strict; open DATAOUT2, '>>', 'cococount.txt' or die "$!\n"; for my $count ( 90 .. 95 ) { open DATAIN, '<', $ARGV[ 0 ] or die "cannot open \"ARGV[0]\":$!"; open DATAOUT, '>', 'variable' or die "$!\n"; while ( <DATAIN> ) { my $field = ( split /\t/ )[ 2 ]; if ( $field >= "0.$count" ) { print DATAOUT; } } close DATAOUT; close DATAIN; #clm close reads file variable, and gives back an integer open VAR2, '-|, 'clm', 'close', '-abc', 'variable', '--is-undirect +ed', '--write-count', '-cc-bound', '5' or die "$!\n"; while ( <VAR2> ) { chomp; print DATAOUT2 "0.$count\t$_\n"; } close VAR2 or warn $! ? "Error closing pipe: $!" : "Exit status $? from clm"; } close DATAOUT2;
Re: split function
by kennethk (Abbot) on Jul 12, 2010 at 16:15 UTC
    Your line while(my @line = <DATAIN>) slurps in the whole file. I think what you mean to write is:

    open(DATAOUT, ">variable")||die"$!\n"; for(my $count=0.9; $count<=1; $count=$count+0.01) { open(DATAIN, "<$ARGV[0]")||die"cannot open \"ARGV[0]\":$!"; while(<DATAIN>) { my @line = split (/\t/); if($line[2] >= $count) { print DATAOUT; } } close DATAIN; }

    The while(<DATAIN>) structure reads the next line into the special variable $_, which is then split on tabs and stored in my @line = split (/\t/);. See I/O Operators and split.

    If this does not meet spec, post your input file (wrapped in code tags) and expected output, so we can see what you see what you see. Read How do I post a question effectively?.

    Update: Please do not change the content of posts - it makes it less likely people will notice your updates and makes it much more difficult to follow threads later. It looks like jwkrahn's post below answers your concerns.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://849033]
Approved by kennethk
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others lurking in the Monastery: (3)
As of 2017-05-28 16:51 GMT
Find Nodes?
    Voting Booth?