[24459] in Perl-Users-Digest
Perl-Users Digest, Issue: 6642 Volume: 10
daemon@ATHENA.MIT.EDU (Perl-Users Digest)
Wed Jun 2 03:05:44 2004
Date: Wed, 2 Jun 2004 00:05:05 -0700 (PDT)
From: Perl-Users Digest <Perl-Users-Request@ruby.OCE.ORST.EDU>
To: Perl-Users@ruby.OCE.ORST.EDU (Perl-Users Digest)
Perl-Users Digest Wed, 2 Jun 2004 Volume: 10 Number: 6642
Today's topics:
Re: Beginner needs help with script :) (Walter Roberson)
Re: Beginner needs help with script :) (Walter Roberson)
CSV dB script help <jameskorea2003@hotmail.com>
Re: CSV dB script help <uri@stemsystems.com>
Re: CSV dB script help <jameskorea2003@hotmail.com>
Re: LWP::UserAgent problem - 500 error (RP)
Re: Why is this upload script not working <me@privacy.net>
Re: Window focus <tadmc@augustmail.com>
Digest Administrivia (Last modified: 6 Apr 01) (Perl-Users-Digest Admin)
----------------------------------------------------------------------
Date: 2 Jun 2004 01:31:10 GMT
From: roberson@ibd.nrc-cnrc.gc.ca (Walter Roberson)
Subject: Re: Beginner needs help with script :)
Message-Id: <c9jaku$qhe$1@canopus.cc.umanitoba.ca>
In article <c9i82a$61e$1@news7.svr.pol.co.uk>,
Player <notachance@inhell.com> wrote:
:Yes well HOW is a NEWCOMER supposedto no that they are to read and adhere to
:some rules spelt out in a document somewere immediately upon entry?
One of the few conditions for a system to become part of Usenet
is that the system is required to direct all new users to the
newsgroup news.announce.newusers . That newsgroup has in it a
series of messages about newsgroup decorum. One of the first pieces
of advice you will see in those messages is that you should always
sit back and watch the newsgroup for a few days before posting.
If you had sat back and watched this newsgroup for as long as 48 hours,
you would have seen one of the automated periodic postings that
advises people on how to get the most out of this newsgroup.
One of the other strong recommendations in news.announce.newusers
is that one should review past postings before placing ones one
posting. I rarely hear these days of any news server that does not
keep at least 3 days worth of archives of comp.lang.perl.misc --
and in those three days of archives, you would have found the
posting guidelines.
Many newsreaders also require, before submitting any particular
posting, that one answer positively to a notice that your message
will be going to hundreds if not thousands of systems, and to
confirm that you are sure that you wish to make the posting.
I would ask, in all seriousness, what further practical steps that we
could take that would -actually- have led to you being aware of the
posting guidelines before your posting. I have not followed every word
of this thread, but my -recollection- is that you said at one point
that you essentially just found the newsgroup, saw the short summary of
its purpose, and proceeded to place your posting. Is there anything
more we can do, that is reasonably within our control, to make
people aware of the posting guidelines, that would been found
by you before you posted? What, in other words, can we do in
practice to prevent future such misunderstandings from happening
with other persons?
--
"Meme" is self-referential; memes exist if and only if the "meme" meme
exists. "Meme" is thus logically a meta-meme; but until the existance
of meta-memes is more widely recognized, "meta-meme" is not a meme.
-- A Child's Garden Of Memes
------------------------------
Date: 2 Jun 2004 01:54:55 GMT
From: roberson@ibd.nrc-cnrc.gc.ca (Walter Roberson)
Subject: Re: Beginner needs help with script :)
Message-Id: <c9jc1f$s4j$1@canopus.cc.umanitoba.ca>
In article <c9fgbq$bn3$1@newsg3.svr.pol.co.uk>,
Player <notachance@inhell.com> wrote:
:I responded that I paid to be online, and in that I meant that I had a right
:to be here and ask questions as much as the next person.
Could I ask you to explain that in more detail? Is your implication
that someone who has not "paid to be online" has less right to
express reasonable ideas/opinions than you, a paying customer of
your ISP have?
For example, I happen to be accessing this newsgroup through the
equipment at my workplace, because this newsgroup is one that is
very useful in learning how to use an important tool that I use as
part of my employment. I am thus not "paying" to access the group,
and indeed sometimes I get paid to access it. Are you attempting
to convey that my right of expression is less than yours?
Mind you, right at the moment, I'm connected to work via a residential
DSL service that my wife is paying for. If our family's residential
DSL service costs more than what you pay, do we have stronger
rights of expression than you do? And should that "costs more" be
on absolute terms or relative to the cost of living differences
between our locations? Is there a formulae for determining who has
more right of access that can be applied to people who are in areas
where telecommunications is expensive but the cost of living is low,
or vice versas?
There have been times when I have accessed this newsgroup through
a server operated by a non-profit group that I volunteered considerable
amounts of time to. They didn't pay me, I didn't pay them, but the
-value- of my contribution was high (the equivilent of several *years*
of full-time expert labour.) How do you figure our relative rights to
expression in that situation, where I paid with heavy effort but not
with my pocketbook?
Is it, in short, your suggestion that this newsgroup ought to comport
itself under the principle that the person who has paid the most in
out-of-pocket expenses to access the newsgroup should be the person
with the greatest influence on the way the newsgroup denizens interact?
If so, then shall we discuss the accounting rules we shall use to
determine those expenses? Net? Gross? Amoritized? 3 year rule?
Canadian Capital Costs Recovery rules (i.e., sinking fund which
is never entirely extinguished, as compared to the more common US
3-years total write-off accounting rule)? Should "system software" be
depreciated at a different rate than "system hardware?" Canadian
CCR rules put those on the same schedule but allow "application software"
to be written off in one year. How shall we take into account different
rates of inflation in different areas? How shall we take into account
currancy fluctuations?
--
Entropy is the logarithm of probability -- Boltzmann
------------------------------
Date: Tue, 1 Jun 2004 22:00:45 -0600
From: "James Hunt" <jameskorea2003@hotmail.com>
Subject: CSV dB script help
Message-Id: <C7idnWmMlvVCzSDdRVn-jw@comcast.com>
Ok this is kinda long ... so i will get to the point ... A friend of mine
started perl script to handle a csv database. And now I am trying to finish
it. I am currently working on the search records feature. For some reason
it always returns all of the records. I have dug through to code and I can
not seem to figure out why it returns all of the records. at the bottom I
have included the script ..... the search form ... and then the csv file
that i built as a test.
Even some perldoc references will help.
Thanks,
James Hunt
---------- database_script.pl ----------
#!/usr/bin/perl
#################################################################
# This script is used toread a spreadsheet in csv format and perfom querys
on arbitrary data sets.
# The form submitted to this will use the name of the fields as the keys for
searches.
# It uses the order of those keys for the order it displays them.
# This sscript assumes that any 6 #'s are dates in YYMMDD format This is
done in the useredit
# and the quicksort.
# Current Bugs: Need to be able to sort by other than numbers, Need validity
set to "D" for users,
# Need click on CASN for other search, and user edit.
# Original Author: Joshua Olson
#################################################################
use CGI ':all';
# The path and file name must be passed as the first two element in a comma
group.
# i.e. ....scriptname.pl?/path/,file_name.csv
# $param[0] is the path name
# $param[1] is the file name
$searchpage = "query.html";
@params = split(/\,/,$ENV{'QUERY_STRING'});
my(@data)=loadtable($params[0],$params[1]);
# Start off with everything and whittle down from there.
my(@match)=(0..$#data);
# Default Header line for html pages.
print header('text/html');
# $params[2] is the all purpose item
if(!$params[2] || $params[2] =~ /edit/i || $params[2] =~ /search/i)
{
search(\@match,\@data);
}
elsif($params[2] =~ /update/i)
{
update(\@data,$params[0],$params[1]);
print "Update Elsif Has Arrived";
}
# If there isnt anything else being done then sort on the key.
elsif($params[2])
{
quicksort($params[2],3, $#params, \@match, \@data);
}
# Login Check For Updating
if($params[2] =~ /edit/i || $params[2] =~ /update/i)
{
if($params[3] eq "user" && $params[4] eq "passwd")
{
# Superuser Edit
printpage(\@match, \@data,'edit');
}
else
{
# User Level Edit
printpage(\@match, \@data,'useredit');
}
}
else
{
# If no edits then display data normally
printpage(\@match, \@data, '');
}
#################################################################
# sub update #
# #
# The subfunction takes the input from the form created by the #
# printpage() sub and prepares the date for the writeupdate() #
# sub. #
# #
# You pass $array by ref and the $dir and $file strings and the #
# form from printpage() was submitted. #
# #
# This sub results in extracting all the entries to update and #
# updated them in the array then called the writeupdate() and #
# wrote them to $dir$file. #
# #
#################################################################
sub update
{
# We need the array, so that memory isnt wasted
my($array,$dir,$file)=@_;
# Get the names of the fields
@fields=param();
# New Blank Entry
@toupdate= ();
# The last one is far undefined
$last=-1;
# Pull the numbers out of each of the field names
foreach $i(@fields)
{
# This is what actually pulls it out
$i =~ /\s(\d+)/;
# No need to duplicate these numbers
if($last != $1)
{
# Push it into the array
push @toupdate,$1;
}
# Make sure we do not dup, so update last
$last=$1;
}
# Now do the update to the array
foreach $num(@toupdate)
{
foreach $imakey(@key)
{
# Same keys just a different format
$$array[$num]{$imakey}=param("$imakey $num");
}
}
writeupdate($array,$params[0],$params[1]);
}
#################################################################
# sub writeupdate
#
# This takes the entire array and writes it to a file in csv
# format.
#
# This passes a ref to the array and, the $path ending with a
# "/" and the $filename in theory it's .csv, but as long as
# it's in the format it doesn't matter what you call it.
#
# This sub results in $dir$file being written to.
#
#################################################################
sub writeupdate
{
my($array,$dir,$file)=@_;
# Open it or die with custom error
open(UPDATEME,">$dir$file") || die "Cannot Open $fname for Writing: $!";
# Select the file for writing
select(UPDATEME);
# Print the keys (col names)
print join(',',@key);
print "\n";
# Print the entry
foreach $imakey(@key)
{
# Do each key
foreach $imakey(@key)
{
print $$array[$i]{$imakey}.',';
}
print "\n";
}
select(STDIO);
# Close that file down
close(UPDATEME);
}
#################################################################
# sub quicksort
#
# This passes the numbers first, last the string (which is what
# we will sort by) and the ref to arrays list and array where
# list is what we're sorting.
#
# Results in a sorted list
#
#################################################################
sub quicksort
{
# Get the variables we need
my($key,$first,$last,$list,$array)=@_;
# If they are eq then sort is done
if($first<$last)
{
# Need to divide the array into pieces
$cuthere = partition($key,$first,$last,$array);
# Recursively continue until done
quicksort($key,$first,$cuthere-1,$list,$array);
quicksort($key,$cuthere,$last,$list,$array);
}
# Return in the new order
@$list=@params[$first..$last];
}
#################################################################
# sub partition
#################################################################
sub partition
{
my($key,$first,$last, $array)=@_;
#Get the last one comparing
$x=$$array[$params[$last]]{$key};
chomp($x);
#Start early so when you add one it's at the beginning
$i=$first-1;
#Check em all, the first to the almost last, last one is the key.
for $j($first..$last-1)
{
#How can we tell that it is a date?
#This doesnt work Right now.
if($key eq "this is a date????")
{
#pull out the value for this entry and chomp it
$temp=$$array[$params[$j]]{$key};
chomp($temp);
#rip $x apart!
#assuming the format YYMMDD
$temp =~ /(\d\d)(\d\d)(\d\d)/;
$xyear =$1;
$xmon = $2;
$xday = $3;
#rip $temp apart!
#assuming the format YYMMDD
$temp =~ /(\d\d)(\d\d)(\d\d)/;
#If the year is higher than the year we're looking for it's a match
if ($1 > $xyear)
{
}
#Otherwise we need to look at the month
elsif ($1 == $year)
{
#Same here as long as it's higher
if($2 > $mon)
{
}
#Same month? keep going
elsif($2 == $mon)
{
#so, now $1==$year && $2==$mon, so day has to be greater
if($3 >= $day)
{
#I get the feeling I should do something here.....
}
}
}
}
#Sure, it sorts numbers, but can it julian fries!?
#Still need strings!!!
if ($$array[$params[$j]]{$key} <= $x)
{
$i++;
#SWITCH!
($params[$i],$params[$j])=($params[$j],$params[$i]);
}
}
$i++;
#Now put the last one in it's place!!!
($params[$i], $params[$last]) = ($params[$last], $params[$i]);
#Return where last now is
return $i;
}
#################################################################
# sub search #
#################################################################
sub search
{
#Need my variables
my($match,$table)=@_;
#The search keys that were sent by the form. These keys must match the keys
in the table file
#exactly (i.e. NAME != Name)
if(param())
{
my(@skeys) = param();
}
else
{
print "HELLO";
my(@skeys) = $params[3];
}
#Do a search on each key sent
foreach $key(@skeys)
{
if(param($key) ne "" && !(param($key) =~ /submit/i || param($key) =~
/edit/i))
{
#This is the value of the key sent
$temp = param($key);
#Replace all spaces with ntohing hte g is for greedy...or global if you
wanna be boring
$temp =~ s/ //g;
$temp =~ s/\*/.*/g;
$temp =~ s/\?/./g;
#In case they're searching ultiple items in a string
@item = split (',',$temp);
#Once for each item
for $i(0..$#item)
{
#Go through each onestill left in the list
#If it's the first time, the whole list is still here.
for $j(@match)
{
#Match the pattern, don't see if they're equal
#Do ranges?
if($$table[$j]{$key} =~ /^$item[$i]/i)
{
#If it matches put in into the array
push (@matches,$j);
}
}
}
#All our temp matches are now allt he matches that still work
@$match=@matches;
}
}
}
#################################################################
# sub loadtable
#################################################################
sub loadtable
{
#Read the variables
my($dir,$file)=@_;
my(@table);
open(FILE,"<$dir$file") || die "Cannot open $fname for reading:$!";
#Read the first line because that has all the column names
$line = <FILE>;
#Get rid of the windows end lines
chomp($line);
chop($line);
#These names will be our keys
@key =split(',',$line);
#This reads in each line of the file starting with the second line
while(<FILE>)
{
#Ger rid of windows end lines
chomp();
chop();
#Make sure there's something we want (Anything) in this line
if(!($_ =~ /[\d\w]/))
{
next;
}
#Stick it into an array and break it at the commas
@line=split(/,/);
#force entry to have anon hash for each line
#very important otherwise everything will have the same values
$entry = {};
#Stick those elements into the proper key.
for $i(0..$#line)
{
#Check for quoted spots, they're just one entry inside the quotes even if
there's commas
#And drop the double quote, we don't need it anymore
if($line[0]=~ s/\"//)
{
#Well we know there's at least two parts,the first quote and the second
$entry->{$key[$i]}= shift @line;
for $j(0..$#line)
{
#Keep an eye out for that second quote
if($line[0]=~ s/\"//)
{
#If we find it we're done with this loop.
$j=$#line;
}
#Hehehe, Guess we got a little happy removing comma's, so now we need to put
some back in
$entry->{$key[$i]}.= ',';
$entry->{$key[$i]}.= shift @line;
}
}
else
{
#Shift is very useful!
$entry->{$key[$i]}= shift @line;
}
}
#So, is push. Add that new line onto the end of the array
push @table, $entry;
}
close(FILE);
#This gives the whole file back now that it's in an easily accessable (and
searchable) format
return @table;
}
#################################################################
# sub printpage
#################################################################
sub printpage
{
my($matches,$table,$edit)=@_;
print <<HEAD;
<html>
<head>
<title>Query Results</title>
</head>
<body bgcolor="#809CAA">
<a href="$searchpage">Return to query</a>
<table align=center border=1.
<tr align=center>
HEAD
#If you're editing you need a form
if($edit){
print "<form action=\"$ENV{'SCRIPT_NAME'}?$params[0],$params[1],UPDATE\"
method=post name=\"edit\">";
}
#And you need if you're a guy with a password you can add new entries
if($edit eq "edit")
{
printrow ($#$table+1,$table,$edit);
}
#We need to know what col's what so printout the names
foreach $colname (@key)
{
#If we're not editing let them do a sort on them too.
if($edit eq "edit")
{
#Making it pretty too, if somone reads the source in the browser
print "\t\t\t<td>$colname</td>\n";
}
else
{
#Can't pass spaces in the address line so make 'em into +es
$as_param=$colname;
$as_param =~ s/ /+/g;
#Call itself in for the sort.
print"\t\t<td><a
href=\"$ENV{'SCRIPT_NAME'}?$params[0],$params[1],$as_param";
#Note: These #'s are the number's of the entry not any value of the table
#This adds all the elements in our matches to the address line and those are
what's sorted on
foreach $i(@$matches)
{
print ','.$i;
}
#Now actually print the name of the col
print"\">$colname</a></td>\n"
}
}
print "\t</tr>\n";
#Print all those entries that matched
foreach $i(@$matches)
{
printrow ($i,$table,$edit);
}
#Again if we're editing then we need a button to submit the changes
if($edit eq "edit") {
print "<input type=submit name=submit value=Udate></form>";
}
print "</table>\n</body>\n</html>";
}
#################################################################
# sub printrow
#################################################################
sub printrow
{
#Get those variables
my($entry,$table,$edit)=@_;
print "\t</tr>\n";
#Go through and write in the order of the keys
foreach $j(@key)
{
print "\t\t<td>\n";
if($edit)
{
print "\t\t\t<input type=\"text\" name=\"$j $entry\" length=6
value=\"$$table[$entry]{$j}\">\n";
}
else
{
print "\t\t\t<a
href=\"$ENV{'SCIPT_NAME'}?$params[0],$params[1],SEARCH,$$table[$entry]{$j}\"
>$$table[$entry]{$j} \;\n</a>";
}
print "\t\t</td>\n";
}
print "\t</tr>\n";
}
---------- query.html ----------
<html><head><title>Query Form</title>
<script language=JavaScript>
function login() {
var login = prompt("What is your user name?","user");
var password = prompt("What is your password?","passwd");
document.forms['ednquery'].action+= ",EDIT,"+login+","+password;
}
</script>
</head>
<body>
<form action="database_script.pl?/Inetpub/wwwroot/cgi-bin/edndb/,dBdata.csv"
method=POST name="dBquery">
<table border=1 align=center>
<tr align=center>
<td>Number</td>
<td>Name</td>
<td>Status</td>
</tr>
<tr>
<td><input type=text name="Number" size=5></td>
<td><input type=text name="Name" size=10></td>
<td><input type=text name="Status" size=10></td>
</tr>
<tr>
<td><input type=submit name="submit" value="Submit"></td>
<td><input type=reset name="clear" value="Clear"></td>
<td><input type=submit name="submitedit" value="Edit"
onClick="login();"></td>
</tr></table>
</form></body></html>
---------- dBdata.csv ----------
Number,Name,Status,
55,Tom,M,
58,Ed,M,
53,Larry,O,
51,Bob,M,
------------------------------
Date: Wed, 02 Jun 2004 04:11:21 GMT
From: Uri Guttman <uri@stemsystems.com>
Subject: Re: CSV dB script help
Message-Id: <x74qpu1tw6.fsf@mail.sysarch.com>
that is way too long to post here.
the indent is nonexistant so i won't waste any time even looking at
it. do you seriously want help? then reindent properly. that code
cannot be read
and why the hell are you using cgi.pm and then munging the query
directly?
gack, this is some ugly ass code.
perl has sort built in. use it.
no strict, no warnings, no taint.
no more looking until you do a major cleanup.
uri
--
Uri Guttman ------ uri@stemsystems.com -------- http://www.stemsystems.com
--Perl Consulting, Stem Development, Systems Architecture, Design and Coding-
Search or Offer Perl Jobs ---------------------------- http://jobs.perl.org
------------------------------
Date: Tue, 1 Jun 2004 22:46:12 -0600
From: "James Hunt" <jameskorea2003@hotmail.com>
Subject: Re: CSV dB script help
Message-Id: <YfmdnfCGCtkYxiDdRVn-hw@comcast.com>
cool can do .. thanks for the info .. I think that when i converted my post
from HTML to plain it lost all the formatting.
james
--
JAMES HUNT
"Uri Guttman" <uri@stemsystems.com> wrote in message
news:x74qpu1tw6.fsf@mail.sysarch.com...
>
> that is way too long to post here.
>
> the indent is nonexistant so i won't waste any time even looking at
> it. do you seriously want help? then reindent properly. that code
> cannot be read
>
> and why the hell are you using cgi.pm and then munging the query
> directly?
>
> gack, this is some ugly ass code.
>
> perl has sort built in. use it.
>
> no strict, no warnings, no taint.
>
> no more looking until you do a major cleanup.
>
> uri
>
> --
> Uri Guttman ------ uri@stemsystems.com --------
http://www.stemsystems.com
> --Perl Consulting, Stem Development, Systems Architecture, Design and
Coding-
> Search or Offer Perl Jobs ----------------------------
http://jobs.perl.org
------------------------------
Date: 1 Jun 2004 23:28:43 -0700
From: izco@hotmail.com (RP)
Subject: Re: LWP::UserAgent problem - 500 error
Message-Id: <9e7779b4.0406012228.13463a1b@posting.google.com>
"Matt Garrish" <matthew.garrish@sympatico.ca> wrote in message news:<St8vc.94346$tb4.3725677@news20.bellglobal.com>...
> "RP" <izco@hotmail.com> wrote in message
> news:9e7779b4.0406011336.4d82b45@posting.google.com...
> > Hi, I'm trying to get the data off of a number of different pages, and
> > I'm getting an error:
> >
> > 500 Can't connect to www.yahoo.com:80 (connect: Permission denied)
> >
> > My code is very simple, I'm just trying to get this to work:
> >
>
> Did you try running it from the command line on your computer? Would have
> proven it's not a problem in the code and saved you some of the headache.
>
> The usual guess is that you have to go through a proxy, but you'll have to
> ask your host why you can't connect out.
>
> Matt
Yes, I tried running it from the command line, and I still receive the
500 error. I'll contact my web host and see why I can't connect out -
do you have any idea why that might be? I looked at the Proxy
attributes for LWP::UserAgent, and they are a little confusing.
Thanks for your help - I'll post what I find from my host.
Randy
------------------------------
Date: Wed, 2 Jun 2004 16:21:48 +1200
From: "Tintin" <me@privacy.net>
Subject: Re: Why is this upload script not working
Message-Id: <2i52u7Fjakc5U1@uni-berlin.de>
"Richard Morse" <remorse@partners.org> wrote in message
news:remorse-FB2C24.16350201062004@plato.harvard.edu...
> In article <ce43fdea.0405281659.7c859f99@posting.google.com>,
> constants@mix-net.net (Mark Constant) wrote:
>
> > open(OUTFILE, '>$dir/$filename')
>
> So a lot of people here complain if you use '"' (ie, double-quotes)
> where you don't need to. However, this is one place where you should.
> What this line is creating is a file named dollar-sign, f, i, l, e, n,
> a, m, e (that is, exactly those characters) in a directory named
> dollar-sign, d, i, r. You probably want this to read:
>
> open(OUTFILE, '>', "$dir/$filename") ...
But of course if error checking was specified, it would have been obvious.
open OUTFILE, ">$dir/$filename" or die "Can not open $dir/$filename $!\n";
------------------------------
Date: Tue, 1 Jun 2004 18:34:12 -0500
From: Tad McClellan <tadmc@augustmail.com>
Subject: Re: Window focus
Message-Id: <slrncbq4jk.rjh.tadmc@magna.augustmail.com>
bill <please_post@nomail.edu> wrote:
>
>
>
> I'm finalizing a script that, during its operation, brings up an
> editor, which, depending on the value of the $EDITOR environmental
> variable, can cause a new X window for the editor to pop up.
> Annoyingly, when this second window closes the original window that
> spawned it does not get the focus back. This forces the user to
> use the mouse, in what would otherwise be an entirely mouseless
> interaction. Is there any trick to return the focus to the original
> window after the temporary editor window has been closed?
Please ask X Windows questions in a newsgroup
about X windows (comp.windows.x.*).
Ask Perl questions here.
--
Tad McClellan SGML consulting
tadmc@augustmail.com Perl programming
Fort Worth, Texas
------------------------------
Date: 6 Apr 2001 21:33:47 GMT (Last modified)
From: Perl-Users-Request@ruby.oce.orst.edu (Perl-Users-Digest Admin)
Subject: Digest Administrivia (Last modified: 6 Apr 01)
Message-Id: <null>
Administrivia:
#The Perl-Users Digest is a retransmission of the USENET newsgroup
#comp.lang.perl.misc. For subscription or unsubscription requests, send
#the single line:
#
# subscribe perl-users
#or:
# unsubscribe perl-users
#
#to almanac@ruby.oce.orst.edu.
NOTE: due to the current flood of worm email banging on ruby, the smtp
server on ruby has been shut off until further notice.
To submit articles to comp.lang.perl.announce, send your article to
clpa@perl.com.
#To request back copies (available for a week or so), send your request
#to almanac@ruby.oce.orst.edu with the command "send perl-users x.y",
#where x is the volume number and y is the issue number.
#For other requests pertaining to the digest, send mail to
#perl-users-request@ruby.oce.orst.edu. Do not waste your time or mine
#sending perl questions to the -request address, I don't have time to
#answer them even if I did know the answer.
------------------------------
End of Perl-Users Digest V10 Issue 6642
***************************************