Ron Woodall wrote:
> 
> Hi All:

Hello,

>          This is a convoluted problem and I hope I can describe it properly.
> 
>          I have about 90 html pages. I am extracting a small amount of
> information from each page and using that to create 90 more pages elsewhere
> in the site.
> 
>          What is happening is that I'm getting the information, assembling
> it correctly and putting it out to the new file. However, randomly, I'm
> getting information repeated in the new file that I cleared.

Which file?

> The result is
> a new file that is 900+KB instead of the intended 10KB.
> 
>          An almost identical structure in another sub-routine works
> perfectly. Thanks for the help. Here's the code that I'm using:

Are you running this code on Perl4?  If you are using Perl5 then you
should be using lexical variables.  (BTW I had to run this through
Perltidy so I could actually read it :-)


>          #================ start update CSS sub-menus
> ==========================
> sub assemblecsssubmenus {
>          opendir(PROPFILES,"$basedir/properties\-list");
                              ^^^^^^^^           ^^
You should _always_ verify that the directory opened.  You should pass
$basedir and declare it locally instead of using a global variable.  A
hyphen doesn't need to be escaped in a double quoted string or regular
expression.

opendir PROPFILES, "$basedir/properties-list"
    or die "Cannot open $basedir/properties-list: $!";


> @dirlist = readdir(PROPFILES); closedir(PROPFILES);
>          splice (@dirlist,0,2);

This will remove valid files on file systems that do not have the '.'
and '..' directory entries.


>          foreach $inproplist (sort @dirlist) {

Does the file list have to be sorted?

>                  if (-d $inproplist) {}
>                  elsif ($inproplist =~ /\.htm/) {

You could do all this filtering and sorting when you read the directory.

my @dirlist = sort grep { !-d and /\.htm$/ } readdir PROPFILES;


> print "$inproplist \n";
>                          open (INPROPLISTS,
> "<$basedir/properties\-list/$inproplist");

You should _always_ verify that the file opened.

open INPROPLISTS, "<$basedir/properties\-list/$inproplist"
    or die "Cannot open $basedir/properties-list/$inproplist: $!";


> @indetail = <INPROPLISTS>; close
> (INPROPLISTS);
>                          for ($w=0; $w<=$#indetail; $w++) {

The more Perlish way to do this is:

for my $w ( 0 .. $#indetail ) {


>                                  if ($indetail[$w] =~ m|^<!-- start
> property (.*?): -->|i) {$propname = $1;
>                                          $indetail[$w+1] =~ /id="(.*?)"/;
> $target = $1;

You shouldn't use the numerical scalars unless the regular expression
matched.

$target = $1 if $indetail[$w+1] =~ /id="(.*?)"/;


>                                          $outmenuprop1 = "<span
> class=\"alpha1\"><img src=\"indent.gif\" height=\"0\" width=\"10\"><a
> href=\"../../properties-list/$propname.htm#$target\"
> target=\"right\">$propname:</a><br></span>\n";
>                                          push @outmenuprop, $outmenuprop1;
> undef $outmenuprop1;

Why just push the string instead putting it in a variable and pushing
the variable?  If you _are_ using Perl5 then use the qq// operator and
avoid all the backslashes.

push @outmenuprop, qq(<span class="alpha1"><img src="indent.gif"
height="0" width="10"><a
href="../../properties-list/$propname.htm#$target"
target="right">$propname:</a><br></span>\n);


> print ".";
>                                  }
>                                  elsif ($indetail[$w] =~ m|^<!-- start
> value $propname: (.*?) -->|i) {$valname = $1;
>                                          $indetail[$w+1] =~ /id="(.*?)"/;
> $target = $1;

$target = $1 if $indetail[$w+1] =~ /id="(.*?)"/;


>                                          $outmenuprop1 = "\t<span
> class=\"alpha2\"><img src=\"indent.gif\" height=\"0\" width=\"26\"><a
> href=\"../../properties-list/$propname.htm#$target\"
> target=\"right\">$valname </a><br></span>\n";
>                                          push @outmenuprop, $outmenuprop1;
> undef $outmenuprop1; print ".";

push @outmenuprop, qq(\t<span class="alpha2"><img src="indent.gif"
height="0" width="26"><a
href="../../properties-list/$propname.htm#$target"
target="right">$valname </a><br></span>\n);


>                                  }
>                                  elsif ($indetail[$w] =~ m|^<!-- start
> copyright -->|i) {}

Why include this elsif statement?


>                          }
> 
> @outmenu = split /\z/, <<"endpmenu";

If you are using Perl4 this is the same as split /z/.  If you are using
Perl5 the \z is special in regular expressions.

perldoc perlre
[snip]
           \z  Match only at end of string


> <html>\z
> <head>\z
>          <title>$propname properties and values menu -
> htmlcompendium.org</title>\z
>          <!-- start meta load -->\z
>                  <meta name="description" content="a description of the
> $propname properties and values.">\z
>                  <meta name="keywords" content="Cascading Style Sheets,
> CSS, documentation, reference, manual, examples, properties, values, tips,
> tricks, HTML">\z
>                  <meta name="rating" content="general">\z
>                  <meta name="author" content="Ronald F. Woodall">\z
>                  <meta name="copyright" content="Copyright 1995, 1996,
> 1997, 1998, 1999, 2000, 2001, 2002 by Ronald F. Woodall, Oxford-on-Rideau,
> Canada">\z
>                  <meta http-equiv="reply-to"
> content="nor\@htmlcompendium.org%20(compendium%20comments)">\z
>          <!-- end meta load -->\z
>          <!-- start style load -->\z
>                  <link rel="stylesheet" type="text/css"
> href="menucomp900.css" title="0comp700">\z
>          <!-- end style load -->\z
> </head>\z
> <body bgcolor="#ffffff" text="#000000" link="#8a8a8a" leftmargin="0"
> topmargin="0" marginheight="0" marginwidth="0" title="Resize this window
> and/or use the scroll bar to view the entire properties/values list!">\z
> endpmenu
> 
>                          push @outmenu, @outmenuprop;
>                          undef @outmenuprop;

If you want to clear out an array then assign a null list:

@outmenuprop = ();


>                          $outmenu1 = "<\/body>\n<\/html>\n";
>                          push @outmenu, $outmenu1;

push @outmenu, @outmenuprop, "</body>\n</html>\n";


>                          undef $outmenu1;

If you want to clear out a scalar then assign a null string or the value
undef:

$outmenu1 = '';  # OR $outmenu1 = undef;


>                          open (OUTPROPMENU,
> ">$basedir/Menus/properties/$inproplist");

You should _always_ verify that the file opened.

open OUTPROPMENU, ">$basedir/Menus/properties/$inproplist"
    or die "Cannot open $basedir/Menus/properties/$inproplist: $!";


>                          print OUTPROPMENU @outmenu;
>                          close (OUTPROPMENU);
> print "\n\@outmenu count is: $#outmenu -- ";
                               ^^^^^^^^^
@outmenu in a scalar context will give you the _actual_ count.

print "\n\@outmenu count is: " . @outmenu . ' -- ';


>                          undef @outmenu;

@outmenu = ();


> print "\@outmenu count is: $#outmenu\n";
>                          undef $propname;
>                          $menucounter++;
>                          undef @indetail;
>                  }
>          }
>          $historyline = "$menucounter CSS menus were created\n";
>          open (HISTORY, ">>$dirname/$version/000history.txt");

You should _always_ verify that the file opened.

open HISTORY, ">>$dirname/$version/000history.txt"
    or die "Cannot open $dirname/$version/000history.txt: $!";


> print HISTORY $historyline; close (HISTORY);
>          undef $historyline; undef $menucounter;
> }



John
-- 
use Perl;
program
fulfillment

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to