On Tue, 19 Apr 2005 13:19:31 -0400, Jay Savage wrote > On 4/19/05, Keith Worthington <[EMAIL PROTECTED]> wrote: > > On Tue, 19 Apr 2005 10:23:00 -0400, Jay Savage wrote > > > On 4/19/05, Keith Worthington <[EMAIL PROTECTED]> wrote: > > > > Hi All, > > > > > > > > Many thanks to Jay for his examples I have now written a perl script > > > > that is munging a text file. Eventually I will move the perl code > > > > into a function inside a postgresql database. > > > > > > > > I am processing inputs like the following: > > > > > > > > 815 HTPP Black 2in sq Border: RMFP025BK Size: 7'10" x 16' > > > > Tag: None > > > > 3000 HTPP Black 4in sq Border: WNY200BK Size: 17' x 50' > > > > Tag: None > > > > 3000 HTPP Black 4in sq Border: WNY200BK Size: 12' x 12'2" > > > > Tag: None > > > > Netform Lily Pad Net Size: 5' X 32' W & L Body Length:24' > > > > 250 HTPP Black 1in sq Border: TW84NTBK Size: 9' x 25' > > > > Tag: 200' sec > > > > 1250 HTPP Yellow 2in sq Border: None Size: 6'1" x 12'7" > > > > Tag: 1855mm x 3840mm > > > > Here is the code that I have written so far. > > > > > > > > #!/usr/bin/env perl > > > > use strict; > > > > use warnings; > > > > > > > > open(INFILE, "input.txt") or die "Can't open input.txt: $!"; > > > > > > > > while (<INFILE>) { # assigns each line in turn to $_ > > > > my $v_border_id = ""; > > > > my $v_size = ""; > > > > my $v_length = ""; > > > > my $v_width = ""; > > > > my $v_tag = ""; > > > > > > > > # Echo out the input line. > > > > print "\nInput line:\n $_"; > > > > # Perform a case insensitive check for the proper data format. > > > > #if (/(?i)border:.*size.*tag:.*/){ > > > > # Perform a case insensitive check for the proper data format. > > > > # Capture the desired parts of the data using parentheses. > > > > if (/(?i).*border:[ ]*(.*)[ ]*size:[ ]*(.*)[ ]*tag:[ ]*(.*)[ ]*/){ > > > > print "properly formatted\n"; > > > > # Check for no border. > > > > if ($1 =~ /(?i)none/){ > > > > $v_border_id = ""; > > > > } else { > > > > $v_border_id = $1; > > > > } > > > > # Parse up the size string. > > > > my ($v_length, $v_width) = split(/x/, $2); > > > > print split(/(?i)[ ]*x[ ]*/, $2); > > > > print "\n"; > > > > # Check for no tag. > > > > #if ($v_tag =~ /(?i)tag:[ ]*none/){ > > > > if ($3 =~ /(?i)none/){ > > > > $v_tag = ""; > > > > } else { > > > > $v_tag = $3; > > > > #$v_tag =~ s/.*(?i)tag:[ ]*//; > > > > } > > > > } else { > > > > print "bad format\n"; > > > > $v_border_id = ""; > > > > $v_size = ""; > > > > $v_tag = ""; > > > > } > > > > print "Border ID: $v_border_id\n"; > > > > print "Size string: $2\n"; > > > > print "Length string: $v_length\n"; > > > > print "Width string: $v_width\n"; > > > > print "Tag string: $v_tag\n\n"; > > > > } > > > > > > > > close INFILE; > > > > > > > > Most of the code seems to be working as expected. I seem to be > > > > having a problem with the split command/assignment as the length > > > > and width strings are blank. The command is based on Jay's > > > > example shown here. > > > > > > > > > my ($length, $width) = split / x /, $size ; > > > > > > > > What I really wanted to do was this. > > > > my ($v_length, $v_width) = split(/(?i)[ ]*x[ ]*/, $2); > > > > > > > > So I put the following in the code to try and understand what > > > > was going wrong. > > > > print split(/(?i)[ ]*x[ ]*/, $2); > > > > print "\n"; > > > > > > [snip] > > > > > > Well, it looks like the immediate issue here is that there is no $2. > > > The match variables, including $1, $2, etc. are reset /every/ time > > > you run a regex, whether you use them or not.. > > > > > > 'if ($1 =~ /(?i)none/){' > > > > > > undef'd $1, $2, and $3 so it could reuse them, and then didn't reload > > > them. The match variables are /very/ temporary; if you're not going > > > to use them immediately, assign them to a temporary variable. > > > > > > Also don't complicate your code unecessarily: if you're never going > > > to turn off case sensitivity (i.e. with (-?i)), just use /none/i instead > > > of /(?i)none/. Your eyes will thank you in the long run. > > > > > > HTH, > > > > > > --jay > > > > Okay that makes sense. But if that is what is happening then > > how come the print statement operating on $2 works just fine? > > > > I appreciate the comment on the i modifier. I didn't realize > > that case sensitivity could be turned off and back on within > > an expression. Not knowing what the bloody users are going > > to do I like to have it off all the time. > > > > Kind Regards, > > Keith > > > > Sorry, not enough coffee. $1, $2, etc. actually stay set until > they're unset, and the scoping is working in your favor here, > although you'll notice all of the use of uninitialized value errors > on your last set of splits. Using them at any distance from the > regex that produced them, though i still likely to produce > unexpected results. Also, your variables aren't scoped proberly > either. You're declaring them with my inside an if block, and then > trying to print them outside. > > my ($v_length, $v_width) = split(/(?i)[ ]*x[ ]*/, $2); > > defeats the purpose of predeclaring the variable. The second my > rescopes both variables to the enclosing block. The effect here is > roughly the same as 'local'. > > There may be more going on here, as well. > > HTH, > > --jay
Thanks. Now I understand the scope issue. I dropped the 'my' out of that section of the code and things started to work. No I am off to write my first perl subroutine. Woohoo! Kind Regards, Keith -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] <http://learn.perl.org/> <http://learn.perl.org/first-response>