[32452] in Perl-Users-Digest
Perl-Users Digest, Issue: 3719 Volume: 11
daemon@ATHENA.MIT.EDU (Perl-Users Digest)
Tue Jun 19 16:09:26 2012
Date: Tue, 19 Jun 2012 13:09:09 -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 Tue, 19 Jun 2012 Volume: 11 Number: 3719
Today's topics:
Re: an effective script for grabbing and putting images <jimsgibson@gmail.com>
Re: an effective script for grabbing and putting images <cal@example.invalid>
Re: an effective script for grabbing and putting images <ben@morrow.me.uk>
Making CGI.pm forget <bernie@fantasyfarm.com>
Re: Making CGI.pm forget <NoSpamPleaseButThisIsValid3@gmx.net>
Re: Making CGI.pm forget (Randal L. Schwartz)
Re: Making CGI.pm forget <bernie@fantasyfarm.com>
Re: Making CGI.pm forget <bernie@fantasyfarm.com>
Re: Making CGI.pm forget <bernie@fantasyfarm.com>
Re: new topic: I call length($<string>) and get number (Tim McDaniel)
Re: new topic: I call length($<string>) and get number <rweikusat@mssgmbh.com>
Digest Administrivia (Last modified: 6 Apr 01) (Perl-Users-Digest Admin)
----------------------------------------------------------------------
Date: Mon, 18 Jun 2012 12:36:03 -0700
From: Jim Gibson <jimsgibson@gmail.com>
Subject: Re: an effective script for grabbing and putting images from or to a website
Message-Id: <180620121236030841%jimsgibson@gmail.com>
In article <G76dnZNFSM6hy0DSnZ2dnUVZ_qGdnZ2d@supernews.com>, Cal
Dershowitz <cal@example.invalid> wrote:
>
> my ($ext) = $name =~ /([^.]*)$/;
>
> Can (anyone) talk me through why this captures an extension? The carat
> anchors the regex at the beginning. $ at the end. parens return the
> match. The asterisk is to quantify what's in brackets, but what's going
> on with the brackets?
Brackets define a "character class", i.e., a set of characters, any one
of which may match a character in the source string ($name).
Character classes have their own syntax. Periods are not special and
only match periods. The ^ character at the beginning means "invert the
class," so [^.] will match any character /except/ a period, and
m/([^.]*)$/ will capture any and all characters at the end of the
string up to but not including the last period in the string. If the
string is a file name, then that is the extension.
If there is no period, the entire string will be captured. If there are
one or more periods, everything to the right of the last period will be
captured.
See 'perldoc perlrecharclass' for details.
--
Jim Gibson
------------------------------
Date: Tue, 19 Jun 2012 10:52:34 -0600
From: Cal Dershowitz <cal@example.invalid>
Subject: Re: an effective script for grabbing and putting images from or to a website
Message-Id: <2t-dnct3qabOM33SnZ2dnUVZ_hSdnZ2d@supernews.com>
On 06/18/2012 01:36 PM, Jim Gibson wrote:
> In article<G76dnZNFSM6hy0DSnZ2dnUVZ_qGdnZ2d@supernews.com>, Cal
> Dershowitz<cal@example.invalid> wrote:
>
>
>>
>> my ($ext) = $name =~ /([^.]*)$/;
>>
>> Can (anyone) talk me through why this captures an extension? The carat
>> anchors the regex at the beginning. $ at the end. parens return the
>> match. The asterisk is to quantify what's in brackets, but what's going
>> on with the brackets?
>
> Brackets define a "character class", i.e., a set of characters, any one
> of which may match a character in the source string ($name).
>
> Character classes have their own syntax. Periods are not special and
> only match periods. The ^ character at the beginning means "invert the
> class," so [^.] will match any character /except/ a period, and
> m/([^.]*)$/ will capture any and all characters at the end of the
> string up to but not including the last period in the string. If the
> string is a file name, then that is the extension.
>
> If there is no period, the entire string will be captured. If there are
> one or more periods, everything to the right of the last period will be
> captured.
>
> See 'perldoc perlrecharclass' for details.
>
Thanks, jim, I'll make that part of my reading tonight. I've almost got
my head around this. One thing I didn't appreciate in such character
classes was that the order was being preserved, so you rely on it not
coming back "gpj."
I could ask a million questions about regex's, but I figure I better
continue with the ones that are most-relevant to my script:
$ perl upload11.pl
Net::FTP>>> Net::FTP(2.77)
Net::FTP>>> Exporter(5.64_01)
Net::FTP>>> Net::Cmd(2.29)
Net::FTP>>> IO::Socket::INET(1.31)
Net::FTP>>> IO::Socket(1.31)
Net::FTP>>> IO::Handle(1.28)
Net::FTP=GLOB(0x853816c)<<< 220 FTP Server ready.
...
Net::FTP=GLOB(0x853816c)<<< 150 Opening BINARY mode data connection for
file list
Net::FTP=GLOB(0x853816c)<<< 226 Transfer complete
name is /home/dan/Desktop/upload_luther/lh1.jpg
winner is image_2.jpg
name is /home/dan/Desktop/upload_luther/lh2.jpg
winner is image_2.jpg
name is /home/dan/Desktop/upload_luther/lh3.jpg
winner is image_2.jpg
$ cat upload11.pl
#!/usr/bin/perl -w
use strict;
use 5.010;
use Net::FTP;
my $domain = '';
my $username = '';
my $password = '';
my $ftp = Net::FTP->new( $domain, Debug => 1, Passive => 1 )
or die "Can't connect: $@\n";
$ftp->login( $username, $password ) or die "Couldn't login\n";
$ftp->binary();
$ftp->cwd('/images/') or die "cwd failed $@\n";
my $path = '/home/dan/Desktop/upload_luther/';
my @files = <$path*>;
my @list = $ftp->ls();
for my $name (@files) {
print "name is $name\n";
my ($ext) = $name =~ /([^.]*)$/;
my @array;
my $winner;
for my $image (@list) {
# print "image is $image\n";
my ($ext2) = $image =~ /([^.]*)$/;
@array = grep ( /$ext2/, @list );
@array = grep ( /image_(\d+)/, @array );
@array = sort @array;
$winner = pop @array;
}
print "winner is $winner\n";
# my ($int) =~ $winner
# push( @list, $winner );
# print "list is @list\n";
}
$
Where I want to go with this is that I want to make a new name that
iterates the digit of the image I'm to upload. This question might
sound completely bizarre, but I'm just gonna throw it out there: how
does one match patterns when part of what you want to match to is stored
in variables and part of what you want to match on is to be expressed as
a regex, and the part you want to capture is in the form of a regex?
Also, when I make the call to $ftp->ls(); I get back the dot and the
double dot. Is there a nifty way to weed those out like I did with the
statement before it?
Thanks all for comments.
--
Cal
------------------------------
Date: Tue, 19 Jun 2012 19:29:53 +0100
From: Ben Morrow <ben@morrow.me.uk>
Subject: Re: an effective script for grabbing and putting images from or to a website
Message-Id: <12t6b9-qun1.ln1@anubis.morrow.me.uk>
Quoth Cal Dershowitz <cal@example.invalid>:
>
> Thanks, jim, I'll make that part of my reading tonight. I've almost got
> my head around this. One thing I didn't appreciate in such character
> classes was that the order was being preserved, so you rely on it not
> coming back "gpj."
Regex captures always return exactly what was in the original string.
This even applies to things like
"xXxxX" =~ /(x*)/i
where you might expect the capture to be lower-cased.
> I could ask a million questions about regex's, but I figure I better
> continue with the ones that are most-relevant to my script:
>
> $ perl upload11.pl
> Net::FTP>>> Net::FTP(2.77)
> Net::FTP>>> Exporter(5.64_01)
> Net::FTP>>> Net::Cmd(2.29)
> Net::FTP>>> IO::Socket::INET(1.31)
> Net::FTP>>> IO::Socket(1.31)
> Net::FTP>>> IO::Handle(1.28)
> Net::FTP=GLOB(0x853816c)<<< 220 FTP Server ready.
> ...
> Net::FTP=GLOB(0x853816c)<<< 150 Opening BINARY mode data connection for
> file list
> Net::FTP=GLOB(0x853816c)<<< 226 Transfer complete
> name is /home/dan/Desktop/upload_luther/lh1.jpg
> winner is image_2.jpg
> name is /home/dan/Desktop/upload_luther/lh2.jpg
> winner is image_2.jpg
> name is /home/dan/Desktop/upload_luther/lh3.jpg
> winner is image_2.jpg
> $ cat upload11.pl
> #!/usr/bin/perl -w
> use strict;
> use 5.010;
> use Net::FTP;
> my $domain = '';
> my $username = '';
> my $password = '';
> my $ftp = Net::FTP->new( $domain, Debug => 1, Passive => 1 )
> or die "Can't connect: $@\n";
> $ftp->login( $username, $password ) or die "Couldn't login\n";
> $ftp->binary();
> $ftp->cwd('/images/') or die "cwd failed $@\n";
> my $path = '/home/dan/Desktop/upload_luther/';
> my @files = <$path*>;
>
> my @list = $ftp->ls();
> for my $name (@files) {
> print "name is $name\n";
> my ($ext) = $name =~ /([^.]*)$/;
> my @array;
> my $winner;
> for my $image (@list) {
> # print "image is $image\n";
> my ($ext2) = $image =~ /([^.]*)$/;
> @array = grep ( /$ext2/, @list );
I don't think this can be what you mean. You are running over @list
multiple times (the for loop goes over the list once, and then each time
round the grep runs over the whole list again), and you aren't using
$ext anywhere.
I suspect that you don't want the inner for loop at all; that is, you
want
for my $name (@files) {
my ($ext) = $name =~ /([^.]*)$/;
my @matching = grep /\.$ext$/, @list;
@matching = grep /image_\d+/, @matching;
@matching = sort @matching;
my $winner = pop @matching;
}
You will notice I've changed the extension-matching logic so that it
actually matches extensions, rather than passing something like
'showjpg.cgi'.
> @array = grep ( /image_(\d+)/, @array );
> @array = sort @array;
> $winner = pop @array;
>
> }
> print "winner is $winner\n";
> # my ($int) =~ $winner
> # push( @list, $winner );
> # print "list is @list\n";
> }
>
> $
>
> Where I want to go with this is that I want to make a new name that
> iterates the digit of the image I'm to upload. This question might
> sound completely bizarre, but I'm just gonna throw it out there: how
> does one match patterns when part of what you want to match to is stored
> in variables and part of what you want to match on is to be expressed as
> a regex, and the part you want to capture is in the form of a regex?
I don't understand what you mean, here. At a guess, based on your 'my
($int) =~ $winner' line above, are you tring to take a list like
image_2.jpg
image_3.jpg
image_1.jpg
and deduce that the next will be 'image_4.jpg'? In that case you want
'map' rather than 'grep':
@matching = map /image_(\d+)/, @matching;
This will leave @matching containing just a list of numbers, so then you
can say
my $newnum = $winner + 1;
my $newfile = "image_$newnum.$ext";
to build a new filename.
> Also, when I make the call to $ftp->ls(); I get back the dot and the
> double dot. Is there a nifty way to weed those out like I did with the
> statement before it?
Not as such. They're not difficult to get rid of, though: your existing
logic to match extensions will get rid of them already.
Ben
------------------------------
Date: Tue, 19 Jun 2012 11:51:44 -0400
From: Bernie Cosell <bernie@fantasyfarm.com>
Subject: Making CGI.pm forget
Message-Id: <2s71u711rmtqqgrq012s9esmmqqltupgve@library.airnews.net>
One aspect of CGI.pm that I've never liked is that it tries to 'remember'
form variables from one page to the next --- and worse makes it hard to
change a value, preferring to ignore your attempts to change the value and
keep the old one unless you go to some bother. I *hate* this behavior and,
basically, always want to build my forms exactly as I want them [and,
indeed, generally prefer sessions to provide continuity from one form to
the next rather than larding up each form].
What I did, years ago, was this:
$cgi = new CGI ;
new CGI("") ; # MAke sure the default CGI object doesn't know anything
and it seemed to work: my intent wsa to make the 'default' CGI object be
truly empty, but I could still get the incoming form data via
$cgi->{whatever}. We're running perl 5.8.8 and have $CGI::VERSION='3.15';
I was chasing an annoying problem with a web page I'd generated and I
discovered the problem. The code is:
print h1("Program access for $progdesc") ;
print "<form>\n" ;
print hidden(prog => $prog), "\n", hidden(page => 'setacl'), "\n" ;
print checkbox_group(-name => "allowed",
-values => [@allusers],
-default => [@allowed],
-linebreak => "true") ;
[...etc....]
and when I view source, I have:
<h1>
Program access for SETPROG
</h1>
<form>
<input type="hidden" name="prog" value="AdminACL" />
<input type="hidden" name="page" value="pickprog" />
<label>
<input type="checkbox" name="allowed" ...
,..etc...
where 'pickprog' was the value of the hidden vbl in the *previous* form. I
was pretty sure this trick [of the double newCGI's] was working and pretty
much relied on it. I even tried putting in a Delete() after the second new
CGI and still the old hidden value persists. Anyone have any insight into
why it appears not to be working any more? And more important: anyone have
any tricks or whatever to *really* defeat CGI's obnoxious [to me! I know
others have different view of this!!] habit of remember old form vbls? I'd
have thought that the Delete() would for-sure fix it, but apparently
not....
Thanks! /bernie\
--
Bernie Cosell Fantasy Farm Fibers
bernie@fantasyfarm.com Pearisburg, VA
--> Too many people, too few sheep <--
------------------------------
Date: Tue, 19 Jun 2012 18:05:08 +0200
From: Wolf Behrenhoff <NoSpamPleaseButThisIsValid3@gmx.net>
Subject: Re: Making CGI.pm forget
Message-Id: <4fe0a335$0$6579$9b4e6d93@newsspool3.arcor-online.net>
Am 19.06.2012 17:51, schrieb Bernie Cosell:
> One aspect of CGI.pm that I've never liked is that it tries to 'remember'
> form variables from one page to the next --- and worse makes it hard to
> change a value, preferring to ignore your attempts to change the value and
> keep the old one unless you go to some bother. I *hate* this behavior and,
> basically, always want to build my forms exactly as I want them [and,
> indeed, generally prefer sessions to provide continuity from one form to
> the next rather than larding up each form].
Hm, I don't do much CGI programming (almost none at all), but the few
times I did it I liked this behaviour... I guess most people are using
template systems anyway and just use CGI to read in data, not to write
pages.
> What I did, years ago, was this:
>
> $cgi = new CGI ;
> new CGI("") ; # MAke sure the default CGI object doesn't know anything
>
> and it seemed to work: my intent wsa to make the 'default' CGI object be
> truly empty, but I could still get the incoming form data via
> $cgi->{whatever}. We're running perl 5.8.8 and have $CGI::VERSION='3.15';
>
> I was chasing an annoying problem with a web page I'd generated and I
> discovered the problem. The code is:
>
> print h1("Program access for $progdesc") ;
> print "<form>\n" ;
> print hidden(prog => $prog), "\n", hidden(page => 'setacl'), "\n" ;
Considering the documentation:
DELETING ALL PARAMETERS:
$query->delete_all();
This clears the CGI object completely. It might be useful to
ensure that all the defaults are taken when you create a
fill-out form.
Use Delete_all() instead if you are using the function call
interface.
It appears that you are using the function call interface, so have you
tried Delete_all()?
- Wolf
------------------------------
Date: Tue, 19 Jun 2012 09:24:13 -0700
From: merlyn@stonehenge.com (Randal L. Schwartz)
To: Bernie Cosell <bernie@fantasyfarm.com>
Subject: Re: Making CGI.pm forget
Message-Id: <86mx3zi82a.fsf@red.stonehenge.com>
>>>>> "Bernie" == Bernie Cosell <bernie@fantasyfarm.com> writes:
Bernie> Anyone have any insight into why it appears not to be working
Bernie> any more? And more important: anyone have any tricks or
Bernie> whatever to *really* defeat CGI's obnoxious [to me! I know
Bernie> others have different view of this!!] habit of remember old form
Bernie> vbls? I'd have thought that the Delete() would for-sure fix it,
Bernie> but apparently not....
"perldoc CGI" =>
-nosticky
By default the CGI module implements a state-preserving behavior
called "sticky" fields. The way this works is that if you are
regenerating a form, the methods that generate the form field values
will interrogate param() to see if similarly-named parameters are
present in the query string. If they find a like-named parameter,
they will use it to set their default values.
Sometimes this isn't what you want. The -nosticky pragma prevents
this behavior. You can also selectively change the sticky behavior
in each element that you generate.
print "Just another Perl hacker,"; # the original
--
Randal L. Schwartz - Stonehenge Consulting Services, Inc. - +1 503 777 0095
<merlyn@stonehenge.com> <URL:http://www.stonehenge.com/merlyn/>
Smalltalk/Perl/Unix consulting, Technical writing, Comedy, etc. etc.
See http://methodsandmessages.posterous.com/ for Smalltalk discussion
------------------------------
Date: Tue, 19 Jun 2012 14:48:28 -0400
From: Bernie Cosell <bernie@fantasyfarm.com>
Subject: Re: Making CGI.pm forget
Message-Id: <l9i1u7dfi22e2rm150647flppkb0qcgosp@library.airnews.net>
merlyn@stonehenge.com (Randal L. Schwartz) wrote:
} >>>>> "Bernie" == Bernie Cosell <bernie@fantasyfarm.com> writes:
}
} Bernie> Anyone have any insight into why it appears not to be working
} Bernie> any more? And more important: anyone have any tricks or
} Bernie> whatever to *really* defeat CGI's ... habit of remember old form
} Bernie> vbls?
}
} "perldoc CGI" =>
}
} -nosticky
} By default the CGI module implements a state-preserving behavior
} called "sticky" fields. ....
DUH -- I never noticed that pragma down at the end of the man page.
THANKS!! /Bernie\
--
Bernie Cosell Fantasy Farm Fibers
bernie@fantasyfarm.com Pearisburg, VA
--> Too many people, too few sheep <--
------------------------------
Date: Tue, 19 Jun 2012 14:52:11 -0400
From: Bernie Cosell <bernie@fantasyfarm.com>
Subject: Re: Making CGI.pm forget
Message-Id: <odi1u7h615dbigqqrjo5ovvveouco0pvrl@library.airnews.net>
merlyn@stonehenge.com (Randal L. Schwartz) wrote:
} >>>>> "Bernie" == Bernie Cosell <bernie@fantasyfarm.com> writes:
}
} Bernie> ... And more important: anyone have any tricks or
} Bernie> whatever to *really* defeat CGI's ... habit of remember old form
} Bernie> vbls?
} "perldoc CGI" =>
}
} -nosticky
I didn't remember that pragma [as I just posted] but I'd set this stuff up
long ago [years now] and so it slipped my mind. I went in to add this
pragma and discovered:
use CGI qw(:all *table *TR *td unescapeHTML -nosticky -debug) ;
That *should* have done the job, even without my double new CGI hackery,
right? Something seems to be amiss and I can't get a handle on what...
Guess I have to write a little test program to see what's happening...
/Bernie\
--
Bernie Cosell Fantasy Farm Fibers
bernie@fantasyfarm.com Pearisburg, VA
--> Too many people, too few sheep <--
------------------------------
Date: Tue, 19 Jun 2012 15:36:26 -0400
From: Bernie Cosell <bernie@fantasyfarm.com>
Subject: Re: Making CGI.pm forget
Message-Id: <uvk1u7d2o9dktfcqlrjbr2vmuku4r1gtso@library.airnews.net>
Bernie Cosell <bernie@fantasyfarm.com> wrote:
} merlyn@stonehenge.com (Randal L. Schwartz) wrote:
}
} } >>>>> "Bernie" == Bernie Cosell <bernie@fantasyfarm.com> writes:
} }
} } Bernie> ... And more important: anyone have any tricks or
} } Bernie> whatever to *really* defeat CGI's ... habit of remember old form
} } Bernie> vbls?
}
} } "perldoc CGI" =>
} }
} } -nosticky
}
} I didn't remember that pragma [as I just posted] but I'd set this stuff up
} long ago [years now] and so it slipped my mind. I went in to add this
} pragma and discovered:
}
} use CGI qw(:all *table *TR *td unescapeHTML -nosticky -debug) ;
}
} That *should* have done the job, even without my double new CGI hackery,
} right? Something seems to be amiss and I can't get a handle on what...
} Guess I have to write a little test program to see what's happening...
I did some more tests and realized that I had done "Delete()" rather than
"Delete_all()" -- correcting it to Delete_all has the vbls non-sticky, at
last. I still don't understand *WHY* I needed to go to all that trouble
but at least things will work now. [I did do one test: I added a random
hidden vbl to the antecedent page [and confirmed it was in the
view-source]. When I then went to the page I was debugging it was NOT
there: so CGI had _not_ brought that vbl forward. BUT: when I put that
hidden vbl into the new page but with a different value, the *old*value*
reappeared. So it is almost as if CGI isn't 'sticky' with _variables_ but
_is_ being sticky with _values_. Dunno... In any event, I think I'm back
on the air.. thanks!
/Bernie\
--
Bernie Cosell Fantasy Farm Fibers
bernie@fantasyfarm.com Pearisburg, VA
--> Too many people, too few sheep <--
------------------------------
Date: Tue, 19 Jun 2012 00:01:33 +0000 (UTC)
From: tmcd@panix.com (Tim McDaniel)
Subject: Re: new topic: I call length($<string>) and get number of lines - code frag below - on MAC OS X 10.7
Message-Id: <jrofgt$pnj$1@reader1.panix.com>
In article <87ipeopuue.fsf@sapphire.mobileactivedefense.com>,
Rainer Weikusat <rweikusat@mssgmbh.com> wrote:
>tmcd@panix.com (Tim McDaniel) writes:
>> Rainer Weikusat <rweikusat@mssgmbh.com> wrote:
>>>Code is not documentation.
>>
>> A source file
>> - must express to the compiler the instructions to be followed
>> - also ideally ought to communicate to a human reader, expressing the
>> purpose and function of the overall file and of the various parts
>>
>> I believe that most code, just by being code, communicates its purpose
>> to humans, at least at the lowest tactical levels and often even
>> higher.
>
>People believe in all kinds of strange stuff. If you wrote the code,
>chances are that seeing it reminds you of its purpose. But that's
>obviously not going to happen for anyone else
I *have* to be misreading you. You can't possibly be asserting that
it is impossible for you to deduce meaning and purpose behind these
example lines that I just came up with:
if (! send_email($from, $to, $subject, $body)) { ... }
foreach $i (0 .. @array-1) { ... }
$value =~ s/\s+/ /g;
$value =~ s/^ //;
$value =~ s/ $//;
my @org_ids = SQLvalues('select id from organization where deleted is null');
my @meta_orgs = GetEnclosingOrgs(@org_ids);
{
my %unique_ids;
@unique_ids{@ids} = ();
@ids = sort keys %unique_ids;
}
--
Tim McDaniel, tmcd@panix.com
------------------------------
Date: Tue, 19 Jun 2012 11:20:56 +0100
From: Rainer Weikusat <rweikusat@mssgmbh.com>
Subject: Re: new topic: I call length($<string>) and get number of lines - code frag below - on MAC OS X 10.7
Message-Id: <874nq7y54n.fsf@sapphire.mobileactivedefense.com>
tmcd@panix.com (Tim McDaniel) writes:
> In article <87ipeopuue.fsf@sapphire.mobileactivedefense.com>,
> Rainer Weikusat <rweikusat@mssgmbh.com> wrote:
>>tmcd@panix.com (Tim McDaniel) writes:
>>> Rainer Weikusat <rweikusat@mssgmbh.com> wrote:
>>>>Code is not documentation.
>>>
>>> A source file
>>> - must express to the compiler the instructions to be followed
>>> - also ideally ought to communicate to a human reader, expressing the
>>> purpose and function of the overall file and of the various parts
>>>
>>> I believe that most code, just by being code, communicates its purpose
>>> to humans, at least at the lowest tactical levels and often even
>>> higher.
>>
>>People believe in all kinds of strange stuff. If you wrote the code,
>>chances are that seeing it reminds you of its purpose. But that's
>>obviously not going to happen for anyone else
>
> I *have* to be misreading you.
The verb is misquoting not misreading.
------------------------------
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:
To submit articles to comp.lang.perl.announce, send your article to
clpa@perl.com.
Back issues are available via anonymous ftp from
ftp://cil-www.oce.orst.edu/pub/perl/old-digests.
#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 V11 Issue 3719
***************************************