Search code examples
perlsubstr

How to use text output from one perl script as input to another perl script? I seem to be able run this as two separate scripts but not as one


I've got a script that reformats an input file and creates an output file. When I try to read that output file for the second part of the script, it doesn't work. However if I split the script into two parts it works fine and gives me the output that I need. I'm not a programmer and surprised I've got this far - I've been banging my head for days trying to resolve this.

My command for running it is this (BTW the temp.txt was just a brute force workaround for getting rid of the final comma to get my final output file - couldn't find another solution):

c:\perl\bin\perl merge.pl F146.sel temp.txt F146H.txt

Input looks like this (from another software package) ("F146.sel"):

/ Selected holes from the .\Mag_F146_Trimmed.gdb database.
"L12260"
"L12270"
"L12280"
"L12290"

Output looks like this (mods to the text: quotes removed, insert comma, concatenate into one line, remove the last comma) "F146H.txt":

L12260,L12270,L12280,L12290 

Then I want to use this as input in the next part of the script, which basically inserts this output into a line of code that I can use in another software package (my "merge.gs" file). This is the output that I get if I split my script into two parts, but it just gives me a blank if I do it as one (see below).

CURRENT        Database,"RAD_F146.gdb"
SETINI         MERGLINE.OUT="DALL"
SETINI         MERGLINE.LINES="L12260,L12270,L12280,L12290"
GX             mergline.gx

What follows is my "merge.pl". What have I done wrong?

(actually, the question could be - what haven't I done wrong, as this is probably the most retarded code you've seen in a while. In fact, I bet some of you could get this entire operation done in 10-15 lines of code, instead of my butchered 90. Thanks in advance.)

# this reformats the SEL file to remove the first line and replace the " with nothing

$file = shift ;
$temp = shift ;
$linesH = shift ;

#open (Profiles, ">.\\scripts\\P2.gs")||die "couldn't open output .gs file";

open my $in,  '<', $file      or die "Can't read old file: Inappropriate I/O control operation";
open my $out, '>', $temp or die "Can't write new file: Inappropriate I/O control operation"; 

my $firstLine = 1;                                                                               

while( <$in> )                                                                                   
{                                                                                                
    if($firstLine)                                                                               
    {                                                                                            
        $firstLine = 0;                                                                          
    }                                                                                            
    else{                                                                                        
   s/"L/L/g; # replace "L with L                                                                 
   s/"/,/g; # replace " with, 
   s|\s+||; # concatenates it all into one line 
   print $out $_;  
    }
} 
close $out;


open (part1, "${temp}")||die "Couldn't open selection file";
open (part2, ">${linesH}")||die "Couldn't open selection file";
printitChomp();

sub printitChomp
{
print part2 <<ENDGS;
ENDGS
}

while ($temp = <part1> )
{
    print $temp;    
    printit();
}

sub printit 
{$string = substr (${temp}, 0,-1);
print part2 <<ENDGS;
$string
ENDGS
}                                                                                      

####Theoretically this creates the merge script from the output 
####file from the previous loop. However it only seems to work 
####if I split this into 2 perl scripts.
open (MergeScript, ">MergeScript.gs")||die "couldn't open output .gs file";
printitMerge();

open (SEL, "${linesH}")||die "Couldn't open selection file";  
sub printitMerge
#open .sel file                                                 

{
print MergeScript <<ENDGS;
ENDGS
}

#iterate over required files
while ( $line = <SEL> ){    
    chomp $line;            
    print STDOUT $line;     
    printitLines();              

}                           

sub printitLines 
{
print MergeScript <<ENDGS;
CURRENT        Database,"RAD_F146.gdb"
SETINI         MERGLINE.OUT="DALL"
SETINI         MERGLINE.LINES="${line}"
GX             mergline.gx

ENDGS
}

Solution

  • so I think all you were really missing was close(part2); to allow it to be reopened as SEL..

    #!/usr/bin/env perl
    
    use strict;
    use warnings;
    
    # this reformats the SEL file to remove the first line and replace the " with nothing
    
    my $file = shift;
    my $temp = shift;
    my $linesH = shift;
    
    open my $in,  '<', $file      or die "Can't read old file: Inappropriate I/O control operation";
    open my $out, '>', $temp or die "Can't write new file: Inappropriate I/O control operation"; 
    
    my $firstLine = 1;                                                                               
    
    while (my $line = <$in>){
      print "LINE: $line\n";
      if ($firstLine){                                                                                            
        $firstLine = 0;                                                                          
      } else {
        $line =~ s/"L/L/g; # replace "L with L
        $line =~ s/"/,/g;  # replace " with,
        $line =~ s/\s+//g; # concatenates it all into one line
        print $out $line;  
      }
    } 
    close $out;
    
    
    open (part1, $temp) || die "Couldn't open selection file";
    open (part2, ">", $linesH) || die "Couldn't open selection file";
    
    while (my $temp_line = <part1>){
      print "TEMPLINE: $temp_line\n";    
      my $string = substr($temp_line, 0, -1);
      print part2 <<ENDGS;
    $string
    ENDGS
    }
    
    close(part2);
    
    #### this creates the merge script from the output 
    #### file from the previous loop.
    open (MergeScript, ">MergeScript.gs")||die "couldn't open output .gs file";
    open (SEL, $linesH) || die "Couldn't open selection file";  
    
    #iterate over required files
    while ( my $sel_line = <SEL> ){
      chomp $sel_line;            
      print STDOUT $sel_line;     
      print MergeScript <<"ENDGS";
    CURRENT        Database,"RAD_F146.gdb"
    SETINI         MERGLINE.OUT="DALL"
    SETINI         MERGLINE.LINES="$sel_line"
    GX             mergline.gx
    
    ENDGS
    
    }
    

    and one alternative way of doing it..

    #!/usr/bin/env perl
    use strict;
    use warnings;
    
    my $file = shift;
    
    open my $in,  '<', $file or die "Can't read old file: Inappropriate I/O control operation";
    my @lines = <$in>;            # read in all the lines
    shift @lines;                 # discard the first line
    my $line = join(',', @lines); # join the lines with commas
    $line =~ s/[\r\n"]+//g;       # remove the quotes and newlines
    
    # print the line into the mergescript
    open (MergeScript, ">MergeScript.gs")||die "couldn't open output .gs file";
    
    print MergeScript <<"ENDGS";
    CURRENT        Database,"RAD_F146.gdb"
    SETINI         MERGLINE.OUT="DALL"
    SETINI         MERGLINE.LINES="$line"
    GX             mergline.gx
    
    ENDGS