Might I make a couple of suggestions on your style and effeciency?
Obviously "there is more than one way to do it", but you have reimplemented
the grep and join commands in a way that may not give consistant results.
See embedded comments (# BTW>).  I would also heavily recommend that you
read the Camel book from O'Reilly.

Brian





[EMAIL PROTECTED] on 01/14/2002 08:17:58 AM

To:   [EMAIL PROTECTED]
cc:
bcc:

Subject:  [cgiapp]  Need help with CGI::Application




I have a cgi script as below
-------------------------------------------------------------------------
  #!/usr/bin/perl -w
  push(@INC,'c:\program files/apache group/apache/cgi-bin');
  # BTW> If your perl is recent enough, you can "use lib 'c:\program....'"
  use testapi;
  my $webapp = testapi->new();
  $webapp->run();
--------------------------------------------------------------------------
The testapi.pm is as below:
--------------------------------------------------------------------------
  package testapi;
  use base 'CGI::Application';
  use strict;
   sub setup {
       my $self = shift;
       $self->start_mode('mode1');
       $self->run_modes(
            'mode1' => 'showapps',
            'mode2' => 'showyear',
            'mode3' => 'showdates',
            'mode4' => 'showdetails'
       );
   }
   sub teardown {
       my $self = shift;
   }
   sub showapps {
       my $self = shift;
       # Get CGI query object
       my $q = $self->query();
       my $val = "";
       my $startloc="e:/it support services/db
architecture/sybase/sysmon-webdb";
       # BTW> Start of section I am commenting on...
       opendir(SMD,"$startloc") || die "Failed to open Sysmon DB";
       # BTW> There is no need to quote a variable.  In fact, this
       stringifys (term
       # BTW> from the perl community, not mine :) the variable needlessly,
       possibly
       # BTW> burning cycles.

       my $c=0;
       my @apps;
       while (my $dir = readdir(SMD))
       {
        $apps[$c] = $dir;
        $c++;
       }
       closedir(SMD);
       for (my $i = 2; $i < $c; $i++ ) {
         $val .= $apps[$i];
         if($i < $c-1)
         {
            $val .= ",";
         }
       }
       # BTW> End of section I am commenting on...
       # BTW> I am assuming that this block of code is loading $val with a
       comma
       # BTW> seperated list of all files in the $startloc directory except
       for
       # BTW> "." and "..".  That can be accomplished more quickly (and
       more Perlish)
       # BTW> with the following snippet of code...
       # BTW>    opendir(SMD, $startloc) || die....
       # BTW>    $val = join(",", grep {m/^\.{1,2}/} readdir(SMD))
       # BTW>    closedir(SMD);
       # BTW> This will open the directory,
       # BTW> read the directory, remove "." and "..", join them with ",",
       and store
       # BTW> the result in $val.  Much shorter and easier to maintain.  It
       also does
       # BTW> not assume that "." and ".." are in the first two directory
       slots.

       my $output = '';
       $output .= $q->start_html(-title => 'Sysmon Database');
       $output .= $q->start_form();
       # BTW> Read Chapter 2 from the Camel book, and in the section on
       Scalar Variables
       # BTW> there is a subsection about the various quotes (search for
       "Interpolate").
       # BTW> That should explain your problem with the next line.
       $output .= $q->scrolling_list(-name=> '@apps', -values=>'$val');
       $output .= $q->hidden(-name => 'rm', -value => 'mode2');
       $output .= $q->submit();
       $output .= $q->end_form();
       $output .= $q->end_html();
       return $output;
   }
   sub showlist {
       my $self = shift;
       # Get CGI query object
       my $q = $self->query();
       my $testcode = $q->param("testcode");
       my $output = '';
       $output .= $q->start_html(-title => 'List of Matching tests');
       $output .= $q->end_html();
       return $output;
   }
   sub showdetail {
       my $self = shift;
       # Get CGI query object
       my $q = $self->query();
       my $testid = $q->param("testid");
       my $output = '';
       $output .= $q->start_html(-title => 'test Detail');
       $output .= $q->end_html();
       return $output;
   }
1;
-----------------------------------------------------------------------

When the script is executed it sends the actual variables in the HTML as
opposed to the values in the variable as in the output below. How do I get
the alctual values from the variables passed in the HTML??

**   <select name="@apps" size="1">
**   <option  value="$val">$val</option>

**   <input type="hidden" name=".cgifields" value="@apps" />

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






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

Reply via email to