[6323] in Perl-Users-Digest
Perl-Users Digest, Issue: 945 Volume: 7
daemon@ATHENA.MIT.EDU (Perl-Users Digest)
Thu Feb 13 23:07:17 1997
Date: Thu, 13 Feb 97 20:01:29 -0800
From: Perl-Users Digest <Perl-Users-Request@ruby.OCE.ORST.EDU>
To: Perl-Users@ruby.OCE.ORST.EDU (Perl-Users Digest)
Perl-Users Digest Thu, 13 Feb 1997 Volume: 7 Number: 945
Today's topics:
Re: Q: how best to share a hash between packages (Mark Daku)
Re: Randal trashed yet again--*sigh* <philip@remove.crl.com>
Re: Reading files in a directory and printing to one tx (Nathan V. Patwardhan)
regex in context <mstearns@darkwing.uoregon.edu>
Re: search engines like infoseek <rootbeer@teleport.com>
Solaris 2.5 with perl ver.5 <robert@tnet.es>
Re: Stumped on INPUT_RECORD_SEPARATER problem - please <rootbeer@teleport.com>
upper to lowercase replace (Michael Paul Stearns)
Re: Using Perl to get LAst Modified Dates (brian d foy)
Digest Administrivia (Last modified: 8 Jan 97) (Perl-Users-Digest Admin)
----------------------------------------------------------------------
Date: 13 Feb 1997 20:27:42 -0500
From: daku@nortel.ca (Mark Daku)
Subject: Re: Q: how best to share a hash between packages
Message-Id: <esqbu9ofa7l.fsf@nortel.ca>
greg@iweb.net (Greg Haygood) writes:
> hi, all
>
> i'm rewriting a CGI/perl application i wrote a while back . the
> basics of the app are that it's composed of a number of scripts, which
> share a bunch of code. previously, this shared code was partly
> bundled in a 'util.pl' script, and the rest was, sadly, duplicated
> among the different pieces of the app. this "structure" just
> followed the code writing, with no real pre-planning involved.
> anyway, i'm going back over the code to modularize and condense the
> pieces.
>
> so now i have a decent module which each main script calls for
> subroutines and variables. the problem is that i really want to add a
> hash to the variables which are exported. this is because each script
> does a lot of work with one or two hashes currently, but would benefit
> from this package'd hash(es), since both the scripts and the modules
> subroutines access this hash.
>
So let me get this straight. You are try to share a hash from a module.
Well that's staright forward you are on the right track. But what it
appears to you want to do is actually share the data in the hash between to
completely seperate processes. Even worse I suspect you want to share the
data in real time. I hope I'm wrong in the way I read you post.
OPTIONS: If you want to share realtime dat between 2 distinct processes.
ipc
socket
flatfile with mdate polling.
database polling.
Some strange event notification system like XAtoms event watching.
etc.
=================================
AGAIN the quick and dirty way to pass around a hash.
sub func1 {
my (*localhash) = @_;
.code.
}
my (%globalhash);
$globalhash{one} = 1;
$globalhash{two} = 2;
func1(*globalhash);
=================================
The best place to look is in the man pages that come with your perl dist.
The 2 pages that pop up are:
perlref - Perl references and nested data structures
perldsc - Perl Data Structures Cookbook
I'm about to do a big NONO. Here is that man page for perlref.
==================================
NAME
perlref - Perl references and nested data structures
DESCRIPTION
Before release 5 of Perl it was difficult to represent complex
data structures, because all references had to be symbolic,
and even that was difficult to do when you wanted to refer to
a variable rather than a symbol table entry. Perl not only
makes it easier to use symbolic references to variables, but
lets you have ``hard'' references to any piece of data. Any
scalar may hold a hard reference. Because arrays and hashes
contain scalars, you can now easily build arrays of arrays,
arrays of hashes, hashes of arrays, arrays of hashes of
functions, and so on.
Hard references are smart--they keep track of reference
counts for you, automatically freeing the thing referred to
when its reference count goes to zero. (Note: The reference
counts for values in self-referential or cyclic data structures
may not go to zero without a little help; see ``Two-Phased
Garbage Collection'' for a detailed explanation. If that thing
happens to be an object, the object is destructed. See the
perlobj manpage for more about objects. (In a sense,
everything in Perl is an object, but we usually reserve the
word for references to objects that have been officially
``blessed'' into a class package.)
A symbolic reference contains the name of a variable, just as
a symbolic link in the filesystem contains merely the name of a
file. The *glob notation is a kind of symbolic reference. Hard
references are more like hard links in the file system: merely
another way at getting at the same underlying object,
irrespective of its name.
``Hard'' references are easy to use in Perl. There is just one
overriding principle: Perl does no implicit referencing or
dereferencing. When a scalar is holding a reference, it always
behaves as a scalar. It doesn't magically start being an array
or a hash unless you tell it so explicitly by dereferencing it.
References can be constructed several ways.
1.By using the backslash operator on a variable,
subroutine, or value. (This works much like the &
(address-of) operator works in C.) Note that this
typically creates ANOTHER reference to a variable,
because there's already a reference to the variable in
the symbol table. But the symbol table reference might
go away, and you'll still have the reference that the
backslash returned. Here are some examples:
$scalarref = \$foo;
$arrayref = \@ARGV;
$hashref = \%ENV;
$coderef = \&handler;
$globref = \*foo;
It isn't possible to create a true reference to an IO
handle (filehandle or dirhandle) using the backslash
operator. See the explanation of the *foo{THING}
syntax below. (However, you're apt to find Perl code
out there using globrefs as though they were IO
handles, which is grandfathered into continued
functioning.)
2.A reference to an anonymous array can be
constructed using square brackets:
$arrayref = [1, 2, ['a', 'b', 'c']];
Here we've constructed a reference to an anonymous
array of three elements whose final element is itself
reference to another anonymous array of three
elements. (The multidimensional syntax described later
can be used to access this. For example, after the
above, $arrayref->[2][1] would have the value
``b''.)
Note that taking a reference to an enumerated list is
not the same as using square brackets--instead it's
the same as creating a list of references!
@list = (\$a, \@b, \%c);
@list = \($a, @b, %c); # same thing!
As a special case, \(@foo) returns a list of references
to the contents of @foo, not a reference to @foo itself.
Likewise for %foo.
3.A reference to an anonymous hash can be constructed
using curly brackets:
$hashref = {
'Adam' => 'Eve',
'Clyde' => 'Bonnie',
};
Anonymous hash and array constructors can be
intermixed freely to produce as complicated a structure
as you want. The multidimensional syntax described
below works for these too. The values above are
literals, but variables and expressions would work just
as well, because assignment operators in Perl (even
within local() or my() ) are executable statements, not
compile-time declarations.
Because curly brackets (braces) are used for several
other things including BLOCKs, you may occasionally
have to disambiguate braces at the beginning of a
statement by putting a + or a return in front so that Perl
realizes the opening brace isn't starting a BLOCK. The
economy and mnemonic value of using curlies is
deemed worth this occasional extra hassle.
For example, if you wanted a function to make a new
hash and return a reference to it, you have these
options:
sub hashem { { @_ } } # silently wrong
sub hashem { +{ @_ } } # ok
sub hashem { return { @_ } } # ok
4.A reference to an anonymous subroutine can be
constructed by using sub without a subname:
$coderef = sub { print "Boink!\n" };
Note the presence of the semicolon. Except for the fact
that the code inside isn't executed immediately, a sub
{} is not so much a declaration as it is an operator, like
do{} or eval{} . (However, no matter how many times
you execute that line (unless you're in an eval(``...'') ),
$coderef will still have a reference to the SAME
anonymous subroutine.)
Anonymous subroutines act as closures with respect to
my() variables, that is, variables visible lexically within
the current scope. Closure is a notion out of the Lisp
world that says if you define an anonymous function in
a particular lexical context, it pretends to run in that
context even when it's called outside of the context.
In human terms, it's a funny way of passing arguments
to a subroutine when you define it as well as when you
call it. It's useful for setting up little bits of code to run
later, such as callbacks. You can even do
object-oriented stuff with it, though Perl provides a
different mechanism to do that already--see the
perlobj manpage .
You can also think of closure as a way to write a
subroutine template without using eval. (In fact, in
version 5.000, eval was the only way to get closures.
You may wish to use ``require 5.001'' if you use
closures.)
Here's a small example of how closures works:
sub newprint {
my $x = shift;
return sub { my $y = shift; print "$x, $y!\n"; };
}
$h = newprint("Howdy");
$g = newprint("Greetings");
# Time passes...
&$h("world");
&$g("earthlings");
This prints
Howdy, world!
Greetings, earthlings!
Note particularly that $x continues to refer to the value
passed into newprint() despite the fact that the ``my $x''
has seemingly gone out of scope by the time the
anonymous subroutine runs. That's what closure is all
about.
This applies to only lexical variables, by the way.
Dynamic variables continue to work as they have
always worked. Closure is not something that most Perl
programmers need trouble themselves about to begin
with.
5.References are often returned by special subroutines
called constructors. Perl objects are just references to
a special kind of object that happens to know which
package it's associated with. Constructors are just
special subroutines that know how to create that
association. They do so by starting with an ordinary
reference, and it remains an ordinary reference even
while it's also being an object. Constructors are
customarily named new(), but don't have to be:
$objref = new Doggie (Tail => 'short', Ears => 'long');
6.References of the appropriate type can spring into
existence if you dereference them in a context that
assumes they exist. Because we haven't talked about
dereferencing yet, we can't show you any examples
yet.
7.A reference can be created by using a special syntax,
lovingly known as the *foo{THING} syntax. *foo{THING}
returns a reference to the THING slot in *foo (which is
the symbol table entry which holds everything known
as foo).
$scalarref = *foo{SCALAR};
$arrayref = *ARGV{ARRAY};
$hashref = *ENV{HASH};
$coderef = *handler{CODE};
$ioref = *STDIN{IO};
$globref = *foo{GLOB};
All of these are self-explanatory except for *foo{IO}. It
returns the IO handle, used for file handles ( open ),
sockets ( socket and socketpair ), and directory
handles ( opendir ). For compatibility with previous
versions of Perl, *foo{FILEHANDLE} is a synonym for
*foo{IO}.
*foo{THING} returns undef if that particular THING
hasn't been used yet, except in the case of scalars.
*foo{SCALAR} returns a reference to an anonymous
scalar if $foo hasn't been used yet. This might change
in a future release.
The use of *foo{IO} is the best way to pass bareword
filehandles into or out of subroutines, or to store them
in larger data structures.
splutter(*STDOUT{IO});
sub splutter {
my $fh = shift;
print $fh "her um well a hmmm\n";
}
$rec = get_rec(*STDIN{IO});
sub get_rec {
my $fh = shift;
return scalar <$fh>;
}
Beware, though, that you can't do this with a routine
which is going to open the filehandle for you, because
*HANDLE{IO} will be undef if HANDLE hasn't been
used yet. Use \*HANDLE for that sort of thing instead.
Using \*HANDLE (or *HANDLE) is another way to use
and store non-bareword filehandles (before perl
version 5.002 it was the only way). The two methods
are largely interchangeable, you can do
splutter(\*STDOUT);
$rec = get_rec(\*STDIN);
with the above subroutine definitions.
That's it for creating references. By now you're probably dying
toknow how to use references to get back to your long-lost
data. There are several basic methods.
1.Anywhere you'd put an identifier (or chain of
identifiers) as part of a variable or subroutine name,
you can replace the identifier with a simple scalar
variable containing a reference of the correct type:
$bar = $$scalarref;
push(@$arrayref, $filename);
$$arrayref[0] = "January";
$$hashref{"KEY"} = "VALUE";
&$coderef(1,2,3);
print $globref "output\n";
It's important to understand that we are specifically
NOT dereferencing $arrayref[0] or
$hashref{``KEY''} there. The dereference of the
scalar variable happens BEFORE it does any key
lookups. Anything more complicated than a simple
scalar variable must use methods 2 or 3 below.
However, a ``simple scalar'' includes an identifier that
itself uses method 1 recursively. Therefore, the
following prints ``howdy''.
$refrefref = \\\"howdy";
print $$$$refrefref;
2.Anywhere you'd put an identifier (or chain of
identifiers) as part of a variable or subroutine name,
you can replace the identifier with a BLOCK returning
a reference of the correct type. In other words, the
previous examples could be written like this:
$bar = ${$scalarref};
push(@{$arrayref}, $filename);
${$arrayref}[0] = "January";
${$hashref}{"KEY"} = "VALUE";
&{$coderef}(1,2,3);
$globref->print("output\n"); # iff IO::Handle is loaded
Admittedly, it's a little silly to use the curlies in this
case, but the BLOCK can contain any arbitrary
expression, in particular, subscripted expressions:
&{ $dispatch{$index} }(1,2,3); # call correct routine
Because of being able to omit the curlies for the simple
case of $$ x, people often make the mistake of viewing
the dereferencing symbols as proper operators, and
wonder about their precedence. If they were, though,
you could use parentheses instead of braces. That's
not the case. Consider the difference below; case 0 is
a short-hand version of case 1, NOT case 2:
$$hashref{"KEY"} = "VALUE"; # CASE 0
${$hashref}{"KEY"} = "VALUE"; # CASE 1
${$hashref{"KEY"}} = "VALUE"; # CASE 2
${$hashref->{"KEY"}} = "VALUE"; # CASE 3
Case 2 is also deceptive in that you're accessing a
variable called %hashref, not dereferencing through
$hashref to the hash it's presumably referencing. That
would be case 3.
3.The case of individual array elements arises often
enough that it gets cumbersome to use method 2. As a
form of syntactic sugar, the two lines like that above
can be written:
$arrayref->[0] = "January";
$hashref->{"KEY"} = "VALUE";
The left side of the array can be any expression
returning a reference, including a previous
dereference. Note that $array[$x] is NOT the same
thing as $array->[$x] here:
$array[$x]->{"foo"}->[0] = "January";
This is one of the cases we mentioned earlier in which
references could spring into existence when in an
lvalue context. Before this statement, $array[$x] may
have been undefined. If so, it's automatically defined
with a hash reference so that we can look up
{``foo''} in it. Likewise $array[$x]->{``foo''}
will automatically get defined with an array reference
so that we can look up [0] in it.
One more thing here. The arrow is optional BETWEEN
brackets subscripts, so you can shrink the above down
to
$array[$x]{"foo"}[0] = "January";
Which, in the degenerate case of using only ordinary
arrays, gives you multidimensional arrays just like C's:
$score[$x][$y][$z] += 42;
Well, okay, not entirely like C's arrays, actually. C
doesn't know how to grow its arrays on demand. Perl
does.
4.If a reference happens to be a reference to an object,
then there are probably methods to access the things
referred to, and you should probably stick to those
methods unless you're in the class package that
defines the object's methods. In other words, be nice,
and don't violate the object's encapsulation without a
very good reason. Perl does not enforce encapsulation.
We are not totalitarians here. We do expect some basic
civility though.
The ref() operator may be used to determine what type of
thing thereference is pointing to. See the perlfunc manpage .
The bless() operator may be used to associate a reference
with a package functioning as an object class. See the perlobj
manpage .
A typeglob may be dereferenced the same way a reference
can, because the dereference syntax always indicates the
kind of reference desired. So ${*foo} and ${\$foo} both
indicate the same scalar variable.
Here's a trick for interpolating a subroutine call into a string:
print "My sub returned @{[mysub(1,2,3)]} that time.\n";
The way it works is that when the @{...} is seen in the
double-quoted string, it's evaluated as a block. The block
creates a reference to an anonymous array containing the
results of the call to mysub(1,2,3). So the whole block
returns a reference to an array, which is then dereferenced by
@{...} and stuck into the double-quoted string. This
chicanery is also useful for arbitrary expressions:
print "That yields @{[$n + 5]} widgets\n";
Symbolic references
We said that references spring into existence as necessary if
they are undefined, but we didn't say what happens if a value
used as a reference is already defined, but ISN'T a hard
reference. If you use it as a reference in this case, it'll be
treated as a symbolic reference. That is, the value of the
scalar is taken to be the NAME of a variable, rather than a
direct link to a (possibly) anonymous value.
People frequently expect it to work like this. So it does.
$name = "foo";
$$name = 1; # Sets $foo
${$name} = 2; # Sets $foo
${$name x 2} = 3; # Sets $foofoo
$name->[0] = 4; # Sets $foo[0]
@$name = (); # Clears @foo
&$name(); # Calls &foo() (as in Perl 4)
$pack = "THAT";
${"${pack}::$name"} = 5; # Sets $THAT::foo without eval
This is very powerful, and slightly dangerous, in that it's
possible to intend (with the utmost sincerity) to use a hard
reference, and accidentally use a symbolic reference instead.
To protect against that, you can say
use strict 'refs';
and then only hard references will be allowed for the rest of
the enclosing block. An inner block may countermand that
with
no strict 'refs';
Only package variables are visible to symbolic references.
Lexical variables (declared with my() ) aren't in a symbol
table, and thus are invisible to this mechanism. For example:
local($value) = 10;
$ref = \$value;
{
my $value = 20;
print $$ref;
}
This will still print 10, not 20. Remember that local() affects
package variables, which are all ``global'' to the package.
Not-so-symbolic references
A new feature contributing to readability in perl version 5.001
is that the brackets around a symbolic reference behave more
like quotes, just as they always have within a string. That is,
$push = "pop on ";
print "${push}over";
has always meant to print ``pop on over'', despite the fact that
push is a reserved word. This has been generalized to work
the same outside of quotes, so that
print ${push} . "over";
and even
print ${ push } . "over";
will have the same effect. (This would have been a syntax
error in Perl 5.000, though Perl 4 allowed it in the spaceless
form.) Note that this construct is not considered to be a
symbolic reference when you're using strict refs:
use strict 'refs';
${ bareword }; # Okay, means $bareword.
${ "bareword" }; # Error, symbolic reference.
Similarly, because of all the subscripting that is done using
single words, we've applied the same rule to any bareword
that is used for subscripting a hash. So now, instead of writing
$array{ "aaa" }{ "bbb" }{ "ccc" }
you can write just
$array{ aaa }{ bbb }{ ccc }
and not worry about whether the subscripts are reserved
words. In the rare event that you do wish to do something like
$array{ shift }
you can force interpretation as a reserved word by adding
anything that makes it more than a bareword:
$array{ shift() }
$array{ +shift }
$array{ shift @_ }
The -w switch will warn you if it interprets a reserved word as
a string. But it will no longer warn you about using lowercase
words, because the string is effectively quoted.
WARNING
You may not (usefully) use a reference as the key to a hash. It
will be converted into a string:
$x{ \$a } = $a;
If you try to dereference the key, it won't do a hard
dereference, and you won't accomplish what you're
attempting. You might want to do something more like
$r = \@a;
$x{ $r } = $r;
And then at least you can use the values() , which will be real
refs, instead of the keys() , which won't.
SEE ALSO
Besides the obvious documents, source code can be
instructive. Some rather pathological examples of the use of
references can be found in the t/op/ref.t regression test in the
Perl source directory.
See also the perldsc manpage and the perllol manpage for
how to use references to create complex data structures, and
the perlobj manpage for how to use them to create objects.
------------------------------
Date: 14 Feb 1997 01:08:34 GMT
From: Phil Stripling <philip@remove.crl.com>
Subject: Re: Randal trashed yet again--*sigh*
Message-Id: <5e0dui$3hu@nexp.crl.com>
Clinton Pierce <cpierce1@cp501.fsic.ford.com> wrote:
: *sigh* The suits have trashed him yet again. Catch the Feb 3 issue
: of Fortune Magazine. For God's sake don't buy it! Just catch it
: online at:
Just out of idle curiousity, is the mention of Randal Schwartz's
conviction _always_ worth bringing up and publishing world-wide on Usenet
and rubbing his nose in it for those that didn't read it in the magazine?
Or is it just something you do for fun?
--
Phil Stripling |Sorry to make it difficult to reply
The Civilized Explorer |but you know what needs to be removed
http://www.cieux.com/~philip/
------------------------------
Date: 14 Feb 1997 01:48:39 GMT
From: nvp@shore.net (Nathan V. Patwardhan)
Subject: Re: Reading files in a directory and printing to one txt file
Message-Id: <5e0g9n$6ok@fridge-nf0.shore.net>
mohawk@swceweb.com wrote:
: I'm completely new at this and am trying to create a script to read a
: bunch of files in a directory and output them to one txt file.
You might peruse some Perl documentation dealing with opendir(),
closedir(), and readdir().
: Can I get some advice as to how to proceed with this?
: thank you
http://www.perl.com/perl ->follow the links to the Perl documentation.
--
Nathan V. Patwardhan
nvp@shore.net
"What is your quest?"
------------------------------
Date: Thu, 13 Feb 1997 16:34:31 -0800
From: Michael Stearns <mstearns@darkwing.uoregon.edu>
Subject: regex in context
Message-Id: <3303B317.615BDCA6@darkwing.uoregon.edu>
I have many .html pages with "same-page" links that look like:
<a href = "#Setting Up procmail">Setting Up procmail</a>
I want all these to look like:
<a href = "#Setting_Up_procmail">Setting Up procmail</a>
In other words, I want to add underscores (I will change the
corresponding "a name" links.)
I am unsure how to replace only those spaces that fall between
<a href = \"#\w+ and \"> without altering other spaces on the page.
Can anyone tell me how to replace the spaces, but only in the context of
the "a href = #....." lines?
Thanks,
Michael Stearns
University of Oregon
------------------------------
Date: Thu, 13 Feb 1997 15:10:47 -0800
From: Tom Phoenix <rootbeer@teleport.com>
To: David Waters <przec@westminster.ac.uk>
Subject: Re: search engines like infoseek
Message-Id: <Pine.GSO.3.95q.970213150746.15428N-100000@julie.teleport.com>
On 13 Feb 1997, David Waters wrote:
> I was wondering if anyone could tell me how the search engines
> on the web work with regard to only displaying 10 search matches
> at a time.
I think you could use the methods in Randal's second Web Techniques
column, which shows how to do that sort of thing. Hope this helps!
http://www.stonehenge.com/merlyn/WebTechniques/
-- Tom Phoenix http://www.teleport.com/~rootbeer/
rootbeer@teleport.com PGP Skribu al mi per Esperanto!
Randal Schwartz Case: http://www.lightlink.com/fors/
------------------------------
Date: 12 Feb 1997 23:53:16 GMT
From: "robert@tnet.es" <robert@tnet.es>
Subject: Solaris 2.5 with perl ver.5
Message-Id: <5dtl5c$86s$1@diana.ibernet.es>
I am a newbie to the world of Perl and would like to try the "hack".I however
am getting off to a bad start in that I can't seem to get past first base.
I would appreciate it if someone could let me know what I should be answering
to all the questions.My intended use is to learn a lttle and try some basic
"hacks" from Matt and Selena Sol's sites.Could someone let me know if they are
willing to guide me through the experience of getting to where I can type 'make
install'
and it works.
Any help would be appreciated,
Regards,
Robert:-)
------------------------------
Date: Thu, 13 Feb 1997 15:06:55 -0800
From: Tom Phoenix <rootbeer@teleport.com>
To: Mark Hickey <cc42735@hrp6.FMR.com>
Subject: Re: Stumped on INPUT_RECORD_SEPARATER problem - please help
Message-Id: <Pine.GSO.3.95q.970213150104.15428M-100000@julie.teleport.com>
On Wed, 12 Feb 1997, Mark Hickey wrote:
> I tried using various other patterns as the $/, like "\n[ \t\f\r]*\n",
> with and w/o various amounts of quoting, but as soon as I put the "[]"
> in, things fall apart.
That's because $/ is not a pattern. Never has been. If you want to split
input on a pattern, you'll have to split it yourself. It's not hard to do.
I'd make a sub which uses sysread to read blocks until it either reaches
eof or finds your split pattern, then returns what's appropriate and
buffers the rest.
Hope this helps!
-- Tom Phoenix http://www.teleport.com/~rootbeer/
rootbeer@teleport.com PGP Skribu al mi per Esperanto!
Randal Schwartz Case: http://www.lightlink.com/fors/
------------------------------
Date: 14 Feb 1997 03:07:13 GMT
From: mstearns@darkwing.uoregon.edu (Michael Paul Stearns)
Subject: upper to lowercase replace
Message-Id: <5e0kt1$egd@pith.uoregon.edu>
I am trying to do a search and replace that involves changing an uppercase character to a lowercase.
Right now I have :
$text=~ tr^(<a href = \"\#)A-Z(\w+.*?\")^\1a-z\2^s;
But this doesn't work.
Any idea what I am doing wrong?
Thanks,
Michael Stearns
University of Oregon
------------------------------
Date: Wed, 12 Feb 1997 21:31:36 -0500
From: comdog@computerdog.com (brian d foy)
Subject: Re: Using Perl to get LAst Modified Dates
Message-Id: <comdog-1202972131360001@nntp.netcruiser>
In article <01bc1986$b1cdd520$e67409a2@BenoitB.deco.com>, "Brian R.
Benoit" <benoitb@detroitedison.com> wrote:
> I need to know if there is a way to get the date last modified of files in
> a directory and compare those dates to a date stored in a cookie.
have you looked at stat()?
> I am new to perl and don't even know where to start looking.
the perlfunc man page is great reading for beginners. shows you
what toys you have to play with :) Chapter 3 of the Blue Camel[1] has
the same info...
[1]
Blue Camel = Programming Perl, Larry Wall, Tom Christensen,
& Randal L. Schwartz, ISBN 1-56592-149-6.
--
brian d foy <URL:http://computerdog.com>
unsolicited commercial email is not appreciated
------------------------------
Date: 8 Jan 97 21:33:47 GMT (Last modified)
From: Perl-Request@ruby.oce.orst.edu (Perl-Users-Digest Admin)
Subject: Digest Administrivia (Last modified: 8 Jan 97)
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.
To submit articles to comp.lang.perl.misc (and this Digest), send your
article to perl-users@ruby.oce.orst.edu.
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.
The Meta-FAQ, an article containing information about the FAQ, is
available by requesting "send perl-users meta-faq". The real FAQ, as it
appeared last in the newsgroup, can be retrieved with the request "send
perl-users FAQ". Due to their sizes, neither the Meta-FAQ nor the FAQ
are included in the digest.
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 V7 Issue 945
*************************************