Robert - Mbdc Diethorn wrote:
>
> Greetings all,
Hello,
> This is my first production Perl script, and I'm having some trouble
> with nested while loops. I'm hoping that someone here can point me in the
> right direction.
> I'm using the script to merge two files and create a third. The
> first is a delimited text export from a DB, the second is a list of XML
> fields, and the intended output is an XML file. Simple, right? Well, at the
> moment I have two problems. If I use "warnings", the script produces the
> following error: "Use of uninitialized value in concatenation (.) or string
> at line 28, (SCHEMAIN) line 62"
>
> It does produce output, but not as I expected, which is the second issue.
> The script processes one line of the input correctly, but then stops,
> apparently dying after one iteration of the second while loop.
> I imagine this problem involves the declaration/redec of $_, but I
> just can't figure out why this can't work. Anyone have any ideas as to
> what's wrong and how I might fix it?
>
> Here are my system vitals:
> Win32
> ActiveState ActivePerl 5.6.1.631
>
> I appreciate any help the wizards can offer.
>
> Rob
>
> #!/usr/bin/perl
> use strict;
> use warnings;
use Fcntl ':seek'; # for seek() macros
> my $datafile = $ARGV[0]; # read 1st argument into
> variable $datafile
> my $schemafile = $ARGV[1]; # etc.
> my $outputfile = $ARGV[2]; # etc.
die "usage: $0 datafile schemafile outputfile\n" unless @ARGV == 3;
my ( $datafile, $schemafile, $outputfile ) = @ARGV;
> open (DATAIN,"$datafile"); # open file named by $datafile for
> reading
> open (SCHEMAIN,"$schemafile"); # open file named by $schemafile for
> reading
> open (XMLOUT, ">>$outputfile"); # open file named by $outputfile for
> writing (appending)
You should _always_ verify that the files were opened.
open DATAIN, '<', $datafile or die "Cannot open $datafile: $!";
open SCHEMAIN, '<', $schemafile or die "Cannot open $schemafile: $!";
open XMLOUT, '>>', $outputfile or die "Cannot open $outputfile: $!";
> print XMLOUT "<substance>\n"; # print opening substance tag to
> outputfile
>
> while (<DATAIN>) {
> chomp;
> my @data = split (/~/,$_); # read line from file called
> by DATAIN into array @data; assign elements split by "~" character
>
> my $count = 0;
You need to reset the SCHEMAIN file handle each time through the outer
loop.
seek SCHEMAIN, 0, SEEK_SET;
> while (<SCHEMAIN>) { # read one line of
> schemafile to $_ while lines are available to read
> my $length = @data; # assign the number
> of array elements to variable $length
> my $newelement = $_; # assign the current
> line of input from schemafile to variable $newelement
> $newelement =~ s/>a/>$data[$count]/; # search for ">a" in
> current line; replace with ">" and a single element from the array @data
> chomp ($newelement);
> print XMLOUT "$newelement\n"; # write new line of
> text to outputfile
> $count++; # increment variable
> $count
This can be written in two lines:
s/>a/>$data[$count++]/;
print XMLOUT;
> }
> }
>
> print XMLOUT "</substance>\n"; # print closing substance tag and
> newline to outputfile
>
> close (XMLOUT);
> close (SCHEMAIN);
> close (DATAIN);
>
> print "datafile = $datafile and schemafile = $schemafile and outputfile =
> $outputfile";
John
--
use Perl;
program
fulfillment
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]