Beefy Boxes and Bandwidth Generously Provided by pair Networks
good chemistry is complicated,
and a little bit messy -LW
 
PerlMonks  

Re: Subroutine question

by cwest (Friar)
on Sep 18, 2000 at 22:06 UTC ( [id://32992]=note: print w/replies, xml ) Need Help??


in reply to Subroutine question

I am completley confused. Please update this post with more information in _context_.

We can help you much better this way.

--
Casey
   I am a superhero.

Replies are listed 'Best First'.
RE: Re: Subroutine question
by jreades (Friar) on Sep 18, 2000 at 22:29 UTC

    The basic point is that it is poor programming style (and ineffecient to boot) to have two subroutines that essentially do the exact same thing.

    From my standpoint as someone who has learnt to code that painful way (is there any other), I've developped the standard methodology that if I have duplicated code (or code that closely duplicates functionalities I've used elsewhere) then I need to go back and look at condensing the duplicates into a single subroutine.

    In this case, then, you might start by changing the subroutine as follows:

    sub file_processing { my ($array_ref, $script, $arg, $file) = @_; open(FILE, $script . ' ' . $arg . ' ' . $file . ' |') or die ("can +'t do it: $!\n"); while (<FILE>) { chomp; next if /^\#/; next if /none/i; next if /unkno/i; push @{$array_ref}, split ( /\n/, $_); } close FILE; }

    Notice, however, that there are some areas that could use some more work:

    1. The regexp that matches none/unknown/# could be improved and probably condensed into a single one looking something like this: /(?:#|unknown|none)/
    2. The assignment back to $array_ref may not do exactly what you expect/need -- a little testing would be in order

    And finally, you'd call this script by doing the following:

    &file_processing(\@array1, $script1, $arg1, $file1); &file_processing(\@array1, $script2, $arg2, $file2);

    Which, of course, using the heuristic of duplicated code = BAD, could be condensed into a single array of arrays that are looped over and passed in in turn.

    Does that help?

RE: Re: Subroutine question
by Limo (Scribe) on Sep 18, 2000 at 22:24 UTC
    my $arg1 = "foo"; my $file1 = "file_1.gz; my $arg2 = "bar"; my $file2 = "file_2.gz"; sub file_processing { $script = "/export/home/ssesar/Perl/another_script.pl"; $open = "$script -e $arg1 $file1"; open(FILE1, "$open |") or die "can't do it\n"; while (<FILE1>) { chomp; next if /^\#/; next if /None/; next if /Unkno/; next if /unkno/; next if /NONE/; @_ = split ( /\n/, $_); @array1 = @_; } close FILE1; }
    1.I want this subroutine to be run as it reads
    2. Then, I want this subroutine to be run a second time with the follo +wing changes: <CODE> $open = "$script -e $arg2 $file2"; open(FILE2, "$open |") or die "can't do it\n"; while (<FILE2>) {
    and...
    @array2 = @_;

      Right, here's what we're saying:

      my @array1; my @array2; my @args = ( [ \@array1, "foo", "file_1.gz"], [ \@array2, "bar", "file_2.gz"] ); foreach (@args) { &file_processing($args->[0], $args->[1], $args->[2]); } sub file_processing { my ($array_ref, $arg, $file) = @_; my $script = "/export/home/ssesar/Perl/another_script.pl"; open(FILE, $script . ' ' . $arg . ' ' . $file . ' |') or die ("c +an't do it: $!\n"); while (<FILE>) { chomp; push @{$array_ref}, $_ unless /^(?:\#|none|unknow)/i; } close FILE; }

      This should do what you want as best as I can tell -- open a file and push into an array (either array 1 or array 2 depending on which iteration) any line that doesn't start with UNKNOW/unknow/#/NONE/none.

      Your lines

      @_ = split ( /\n/, $_); @array1 = @_;

      look very strange -- as someone else pointed out, if you're reading in the file line by line (which is what <FILE> implies) then the final split on \n is useless.

      In addition, you're only assigning the last value of @_ to @array1 (meaning the other values are lost) unless you've undefined $/, in which case you should just use my $file = <FILE> rather than the while loop.

      Hope this helps.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://32992]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others admiring the Monastery: (3)
As of 2024-04-25 17:15 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found